我想通过node.js更新AWS DynamoDB中的现有项目。我只有我想要更新的项目的二级索引值。我无法访问主索引...
Id: primary index
CallId: global secondary index
CallStatus: normal field
我想通过使用CallId(不使用密钥)来更新CallStatus。
我尝试了不同的方法,如:
但这些方法都不适合我。我假设,因为我没有正确使用它们。任何帮助表示赞赏: - )。
“扫描和更新”方法的代码示例:
var docClient = new aws.DynamoDB.DocumentClient();
var params = {
TableName: 'myTable',
FilterExpression: 'CallId = :c',
ExpressionAttributeValues: {
':c': callSid
}
};
docClient.scan(params, function (err, result) {
if (err) {
console.error("Unable to query item. Error JSON:", JSON.stringify(err));
} else {
console.log(result);
// Update call status
var params = {
TableName: "myTable",
Key: {
"Id": result.Items[0].Id
},
UpdateExpression: "set CallStatus = :s",
ExpressionAttributeValues: {
":s": callStatus
},
ReturnValues: "UPDATED_NEW"
};
docClient.update(params, function (err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err));
} else {
console.log("Update item succeeded:", JSON.stringify(data));
}
});
}
});
答案 0 :(得分:1)
好的,我发现了我的错误。上述更新后的调用应该关闭AWS Lambda会话,因此DynamoDB的异步更新永远不会发生......
现在正在运行的代码如下:
var params = {
TableName: 'table',
IndexName: 'CallId-index',
KeyConditionExpression: 'CallId = :id',
ExpressionAttributeValues: {
':id': callSid
}
};
docClient.query(params, function (err, result) {
if (err) {
console.log("Unable to query item. Error JSON:", JSON.stringify(err));
} else {
var params = {
TableName: "table",
Key: {
"Id": result.Items[0].Id
},
UpdateExpression: "set CallStatus = :s",
ExpressionAttributeValues: {
":s": callStatus
},
ReturnValues: "UPDATED_NEW"
};
docClient.update(params, function (err, data) {
if (err) {
console.log("Unable to update item. Error JSON:", JSON.stringify(err));
} else {
// do sth. else
}
});
}
});