Amazon dynamodb 如何使用AWS Amplify回填新的AppSync字段
我正在使用GraphQL将一个排序字段添加到我的一个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
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));
}
});
}