Amazon dynamodb 如何使用AWS Amplify回填新的AppSync字段

Amazon dynamodb 如何使用AWS Amplify回填新的AppSync字段,amazon-dynamodb,aws-amplify,aws-appsync,dynamodb-queries,Amazon Dynamodb,Aws Amplify,Aws Appsync,Dynamodb Queries,我正在使用GraphQL将一个排序字段添加到我的一个AppSync表中。新架构如下所示: type MyTable @model @auth(rules: [{allow: owner}]) @key(name: "BySortOrder", fields: ["sortOrder"], queryField: "tableBySortOrder") { id: ID! name: String! sortOrder: Int } 但是,当使用tableBySortOr

我正在使用GraphQL将一个排序字段添加到我的一个AppSync表中。新架构如下所示:

type MyTable
  @model
  @auth(rules: [{allow: owner}])
  @key(name: "BySortOrder", fields: ["sortOrder"], queryField: "tableBySortOrder")
{
  id: ID!
  name: String!
  sortOrder: Int
}
但是,当使用tableBySortOrder检索列表时,我会得到一个空列表,因为新字段sortOrder为null

我的问题是,如何将这些数据回填到DynamoDB表中,以便现有用户不会被这一新的更改中断?对于传统数据库,我将运行一个SQL更新:updatemytable SET sortOrder=


然而,我是NoSQL/AWS新手,除了在用户登录到我的应用程序时构建一个回填脚本外,我找不到其他方法来实现这一点。那感觉很不舒服。处理这种情况的最佳实践是什么?

您是否已经在DDB中创建了新字段? 如果是,我认为您应该在更改客户端之前将其回填

编写一个脚本来迭代并更新表。这方面的选择:

Java-如果有任何整数测试正在运行,则调用updateItem来更新表。 Bash-使用AWS CLI:AWS dynamodb scan-表格名称项目属性-投影表达式>/tmp/item\u attributes\u table.txt,然后使用AWS dynamodb更新项目-表格名称项目属性-键。这是一种肮脏的方式。 Python-与上面相同的逻辑。
最终使用了与Sunny建议的nodejs脚本类似的东西:

const AWS = require('aws-sdk')

AWS.config.update({
  region: 'us-east-1'
})

// To confirm credentials are set
AWS.config.getCredentials(function (err) {
  if (err) console.log(err.stack)
  // credentials not loaded
  else {
    console.log('Access key:', AWS.config.credentials.accessKeyId)
    console.log('Secret access key:', AWS.config.credentials.secretAccessKey)
  }
})

const docClient = new AWS.DynamoDB.DocumentClient()

const table = 'your-table-dev'

const params = {
  TableName: table
}

const itemMap = new Map()

// Using scan to retrieve all rows
docClient.scan(params, function (err, data) {
  if (err) {
    console.error('Unable to query. Error:', JSON.stringify(err, null, 2))
  } else {
    console.log('Query succeeded.')
    data.Items.forEach(item => {
      if (itemMap.has(item.owner)) {
        itemMap.set(item.owner, [...itemMap.get(item.owner), item])
      } else {
        itemMap.set(item.owner, [item])
      }
    })

    itemMap.forEach(ownerConnections => {
      ownerConnections.forEach((connection, index) => {
        connection.sortOrder = index
        update(connection)
      })
    })
  }
})

function update(connection) {
  const params = {
    TableName: table,
    Key: {
      'id': connection.id
    },
    UpdateExpression: 'set sortOrder = :s',
    ExpressionAttributeValues: {
      ':s': connection.sortOrder,
    },
    ReturnValues: 'UPDATED_NEW'
  };

  console.log('Updating the item...');
  docClient.update(params, function (err, data) {
    if (err) {
      console.error('Unable to update item. Error JSON:', JSON.stringify(err, null, 2));
    } else {
      console.log('UpdateItem succeeded:', JSON.stringify(data, null, 2));
    }
  });
}