我正在尝试创建一个 ConditionExpression
以仅更新我的 DynamoDB 表 item
中的 status
。我就是这样做的:
dynamo.update({
TableName,
Key,
UpdateExpression: 'SET #status = :status',
ExpressionAttributeNames: {
'#status': 'status'
},
ExpressionAttributeValues: {
':lastStatus': 'FINISH',
':status': 'PROCESSING'
},
ConditionExpression: 'not(contains(:lastStatus, :status))',
ReturnValues: 'ALL_NEW'
}, (err, data) => {
if (err) return console.error(err)
console.log(data)
})
但它不起作用。状态正在更新为“处理中”,即使是“完成”。
最佳答案
你的 ConditionExpression
看起来它总是会产生真实的结果。来自 the documentation , contain
函数采用路径和操作数值。如果路径是字符串,则当该字符串包含操作数值作为子字符串时返回 true;如果路径是一个集合,则当该集合包含操作数值作为其元素之一时,它返回 true。
您将两个表达式值代入您的函数,因此它的计算结果始终为 contain('FINISH', 'PROCESSING')
,这永远不会是真的。 not
环绕它使它始终为真,因此始终满足条件。
如果您只是不想在状态已经为“正在处理”时进行更新,您可能会幸运地使用 ConditionExpression
喜欢'#status <> :lastStatus'
.这应该只在 status
时返回 true属性不等于“PROCESSING”的值。
关于javascript - 如果当前状态 !== 'FINISH',则使用 ConditionExpression 仅更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49307426/