E.J.给出的答案。 Brennan 非常适合替换整个项目的情况。 DocumentClient 减轻了处理 DynamoDB 属性类型的麻烦,但给出的示例使用了put 方法。根据文档put 传递给putItem,其中
创建新项目,或用新项目替换旧项目
这意味着它无助于对您还没有完整记录的现有项目进行部分更新(并且可以完全替换)。对于部分更新,您必须使用 updateItem,或者它的 DocumentClient 对应项,update。
AWS 实验室有 published a utility 来帮助构建更新表达式以与 updateItem 一起使用。由于我通常更喜欢使用 DocumentClient,因此我使用 DynamoDB 的 Converter 提供的实用程序函数解组值(是的,我知道这有点来回,但它使测试更容易)。
const AWS = require('aws-sdk');
const db = new AWS.DynamoDB.DocumentClient();
const { UpdateExpression, ExpressionAttributes } = require('@aws/dynamodb-expressions');
const { unmarshall } = AWS.DynamoDB.Converter;
const updateExpressionProps = ({ category, classification }) => {
attributes = new ExpressionAttributes();
expression = new UpdateExpression();
expression.set('category', category);
expression.set('classification', classification);
return {
UpdateExpression: expression.serialize(attributes),
ExpressionAttributeNames: attributes.names,
ExpressionAttributeValues: unmarshall(attributes.values),
};
};
const updateRequest = async ({ id, subject, category, classification }) =>
await db
.update({
TableName: 'table-name',
Key: {
id,
subject,
},
...updateExpressionProps({ category, classification }),
})
.promise();
这段代码只更新了id和subject标识的记录上的category和classification属性,而无需手动构建正确的UpdateExpression字符串。这个例子可以很容易地推广到整个项目中可重用的东西。