我想更新DynamoDB表中的项目。我只想更新每个项目中的2个属性。如果项目不存在,我想忽略它。我尝试了TransactWriteItems或BatchWriteItems API,但使用它们时,我必须首先调用getItems API以筛选出不存在的项目。是否有办法避免调用getItems API调用?
index.js
const {DocumentClient} = require("aws-sdk/clients/dynamodb");
const documentClient = new DocumentClient({region:'us-west-2'});
exports.handler = async (event, context) => {
const filteredItems = await client.getItems(event.body.items)
await client.updateItems(filteredItems, event.body.soldPrice, documentClient);
}
client.js
const updateItems = async(filteredItems, soldPrice, documentClient) => {
let params = {
RequestItems: {
[tableName] : {
filteredItems.map((key) =>({
PutRequest: {
Item: {
itemNumber: key.itemNumber,
soldPrice: soldPrice,
lastModified: new Date().toISOString()
}
}
})
}
};
documentClient.batchWrite(params).promise()
}
更新:我也尝试了以下,这清除了现有的值:
const buildUpdateRequest = (filteredItems, soldPrice) => {
return items.map((item) => ({
PutRequest: {
Item: {
'itemNumber': item,
'soldPrice': soldPrice,
'lastModified': new Date().toISOString()
},
ConditionExpression: 'attribute_exists(itemNumber)'
}
}));
}
const batchWriteInvoices = (filteredItems, state, documentClient) => {
const params = {
RequestItems: {
[tableName]: buildUpdateRequest(filteredItems, state),
}
};
documentClient.batchWrite(params, (err, data) => {
if (err) {
console.error('Error:', err);
} else {
console.log('Success:', data);
}
});
}
1条答案
按热度按时间myzjeezk1#
您需要使用ConditionExpression。
在cli中,对于PutItem,它看起来像下面这样。相同的逻辑适用于您的BatchWrite或TxWrite。