DynamoDB:在 UpdateExpression 上使用 SET 来增加字段不起作用

问题描述 投票:0回答:1

我遵循 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 一起使用,将其与其他字段的更新结合起来,例如最后一次信用添加日期的时间戳。

我做错了什么?

aws-lambda amazon-dynamodb aws-serverless aws-sdk-js aws-sdk-nodejs
1个回答
0
投票

SET
版本需要属性
user.credit
。更新之前就存在。相比之下,
ADD
适用于没有字段定义的项目。 AKA 使用
SET
要求您有单独的方法来设置初始值。

您测试中的问题很可能是该字段没有初始值。

© www.soinside.com 2019 - 2024. All rights reserved.