如何使用 ConditionExpression 更新一个属性值而不影响其他属性 - DynamoDB

Posted

技术标签:

【中文标题】如何使用 ConditionExpression 更新一个属性值而不影响其他属性 - DynamoDB【英文标题】:How to update one attribute value using ConditionExpression without affecting other attributes - DynamoDB 【发布时间】:2022-01-21 14:45:18 【问题描述】:

我需要更新 DynamoDB 表项的属性值。 repeats 部分应仅在 usersIDs 数组与当前的 用户 ID 一致时更新用户。

然后我创建了 ConditionExpression 并运行它。

var metricsParams = 
                TableName: table,
                Key:
                   "metricsID" : metricsID,
                ,
                UpdateExpression: "SET fans.orgID = :orgIDNew, fans.orgName = :orgNameNew, fans.noOfGamesPlayed = fans.noOfGamesPlayed + :val, Moment.datePlayed = :dateNew, Moment.monthPlayed = :monthNew, Moment.week = :weekNew, Moment.usersIDs = list_append(Moment.usersIDs, :usersNew), Moment.repeats = list_append(Moment.repeats, :repeateUsers)",
                ConditionExpression: "contains(Moment.repeats, :repeateUsers)",
                ExpressionAttributeValues:
                    ":orgIDNew": body.team.id,
                    ":orgNameNew": body.team.domain,
                    ":val": 1,
                    ":dateNew" : Moment().format('LL'),
                    ":monthNew" : Moment().format("MMMM"),
                    ":weekNew" : Moment().format('WW'),
                    ":usersNew" : [body.user.id],
                    ":repeateUsers": [body.user.id]
                ,
    
                ReturnValues:"UPDATED_NEW"
    
            ;
            console.log("Attempting a conditional update...");
            metricsDoc.update(metricsParams, function(err, data) 
            if (err) 
            console.error("Unable to update item. *from id update* Error JSON:", JSON.stringify(err, null, 2));
             else 
            console.log("UpdateItem succeeded: FROM DYNAMODB METRICS**", JSON.stringify(data, null, 2));

但是当我添加这个 ConditionExpression 时,其他属性也会因此而影响。那么我该如何解决这个问题。我需要创建单独的 UpdateExpression 吗?

【问题讨论】:

【参考方案1】:

你是对的。如果您有多个条件,则需要多个操作。一个操作可以有0-1个条件,适用于整个操作:

Docs:如果条件表达式为真,则操作成功;否则操作失败

根据您当前的结构,这里有两个选项:

    进行两项更新操作,一项是无条件的,一项是有条件的。 (注意list_append(Moment.repeats, :repeateUsers) 不防止添加重复条目) 进行查询以检索当前记录,并在确定需要写入的内容后,进行一次无条件更新操作。

【讨论】:

以上是关于如何使用 ConditionExpression 更新一个属性值而不影响其他属性 - DynamoDB的主要内容,如果未能解决你的问题,请参考以下文章

Activiti学习记录

[精选] Mysql分表与分库如何拆分,如何设计,如何使用

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?