DynamoDB UpdateItem:仅当指定属性存在时更新目标属性
解决方案
要实现仅当#V2属性存在时才将#V1设置为"aaa",同时保证#TS和#STS无条件更新,需要做两处关键调整:
1. 添加目标值到表达式变量
首先在ExpressionAttributeValues中新增:aaa变量,对应要设置的字符串"aaa":
ExpressionAttributeValues: { ":ts": { N: Date.now() + "" }, ":st": { S: "zzz" }, ":aaa": { S: "aaa" } // 新增该变量 }
2. 编写条件更新逻辑
在UpdateExpression的???位置,使用DynamoDB的IF函数结合attribute_exists判断属性是否存在,实现条件赋值:
#V1 = IF(attribute_exists(#V2), :aaa, #V1)
也可以使用CASE表达式写法,效果完全一致:
#V1 = CASE WHEN attribute_exists(#V2) THEN :aaa ELSE #V1 END
注意事项
你当前的ExpressionAttributeNames中#V1和#V2都映射到了同一个值"Value",这会导致DynamoDB无法区分两个属性,属于笔误,需要修改为实际的不同属性名,例如:
ExpressionAttributeNames: { "#TS": "Timestamp", "#STS": "Status", "#V1": "Value1", // 替换为真实属性名1 "#V2": "Value2" // 替换为真实属性名2 }
完整代码示例
let input = { Key: { PK: { S: "xxx" }, SK: { S: "yyy" } }, ExpressionAttributeValues: { ":ts": { N: Date.now() + "" }, ":st": { S: "zzz" }, ":aaa": { S: "aaa" } }, ExpressionAttributeNames: { "#TS": "Timestamp", "#STS": "Status", "#V1": "Value1", "#V2": "Value2" }, UpdateExpression: "SET #TS = :ts, #STS = :st, #V1 = IF(attribute_exists(#V2), :aaa, #V1)", TableName: "WhatsappMessenger" }; let command = new UpdateItemCommand(input);
逻辑说明
- 无论
#V2是否存在,#TS和#STS都会被正常更新 - 当
#V2存在时,#V1会被设置为"aaa";若#V2不存在,#V1保持原有值(若之前无#V1属性,则不会新增)
内容的提问来源于stack exchange,提问作者Ilya Shcherbakov
相关产品推荐
相关产品推荐

