我正在处理一个查询,我需要使用dynamoDB的TrasactWrite并在其中一个表上执行更新查询。
场景是我拥有唯一ID数组,我需要对数组中的每个ID执行相同的更新操作,并在不使用Loop或map的情况下更改表中的一个标志。
但是我很难找到有关如何在ID上使用IN运算符的示例或文档,这些ID是transactWrite的Key参数中的主键。
这是我的示例代码:
let IDs = await find('table', { type: 'some_type' }, 'type-index}
let params = {
TransactItems: [{
Update: {
TableName: 'table',
Key: '#_id IN :IDs,
UpdateExpression: 'set #flag = :flag',
ExpressionAttributeNames: {
'#flag': 'flag',
'#_id': '_id'
},
ExpressionAttributeValues: {
':flag': false,
":IDs": IDs
}
}
}]
}
已经尝试过:Answer与我的问题不同
如果有人有任何疑问,我会回答。任何帮助都会非常有帮助。谢谢
在这种情况下,您不能使用IN
运算符-Update
。使用update
运算符,您必须将键值放入Update
对象。一个键包括partitionKey
和sortKey
,我想在您的情况下,您只需设置partitionKey
。
要通过ID更新多个项目,可以在TransactItems
中放置多个更新对象。
let IDs = await find('table', { type: 'some_type' }, 'type-index');
let params = {
TransactItems: [], // init empty array
}
IDs.forEach((ID) => {// loop though IDs array
params.TransactItems.push({
Update: {
TableName: 'table',
Key: {
partitionKey: ID, // ID value
},
UpdateExpression: 'set #flag = :flag',
ExpressionAttributeNames: {
'#flag': 'flag',
// '#_id': '_id' // remove this line
},
ExpressionAttributeValues: {
':flag': false,
// ":IDs": IDs // remove this line
}
}
})
});
// await client.transactWrite(params).promise()