如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章