我遵循 AWS 文档 来实现 lambda 来增加 DynamoDB 中具有标量值的字段的值。就我而言,我使用的是 NodeJS SDK v3,但文档有时会将您重定向到此页面。
我的问题是,当我用来增加某些字段的值时,
SET
中的UpdateExpression
命令不起作用。
这是我如何初始化命令并执行它的示例:
const params = {
TableName: 'MyTable',
Key: { id: 'my-id' },
ExpressionAttributeNames: {
'#credit': 'user.credit',
},
ExpressionAttributeValues: {
':creditToAdd': 100,
},
UpdateExpression: 'SET #credit = #credit + :creditToAdd',
ReturnValues: 'ALL_NEW'
};
const client = new DynamoDBClient(options);
const docClient = new DynamoDBDocumentClient(client);
const command = new UpdateCommand(params);
const updateUserResponse = await docClient.send(command);
这是我得到的错误:
ValidationException: The provided expression refers to an attribute that does not exist in the item
当我像这样使用
UpdateExpressions
时:
UpdateExpression: 'SET #credit = :creditToAdd',
我没有任何问题,只是当我在上面放置一些操作数时失败。
ADD
而不是 SET
,并且它有效:
UpdateExpression: 'ADD #credit :creditToAdd',
但是正如您在文档中看到的:
一般来说,我们建议使用 SET 而不是 ADD。
事实上,我更喜欢将它与 SET 一起使用,将其与其他字段的更新结合起来,例如最后一次信用添加日期的时间戳。
我做错了什么?
SET
版本需要属性user.credit
。更新之前就存在。相比之下,ADD
适用于没有字段定义的项目。 AKA 使用 SET
要求您有单独的方法来设置初始值。
您测试中的问题很可能是该字段没有初始值。