javascript - 如果当前状态 !== 'FINISH',则使用 ConditionExpression 仅更新状态

标签 javascript node.js amazon-dynamodb aws-sdk

我正在尝试创建一个 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/

相关文章:

javascript - 风 sails js mongodb 填充

node.js - NPM 全局标志在 Windows 上似乎不一致

amazon-web-services - AWS APIgateway 响应映射

amazon-dynamodb - DynamoDB 是否支持 AVG、MAX、MIN 等聚合函数?

Javascript:如何在 if 构造中获得变量可以等于的可能值列表

javascript - Angularjs 指令和 string.format

javascript - 如何在没有 JSX 的情况下渲染多个 child

node.js - Angular 6 和 Vagrant 问题

javascript - Puppeteer 获取数据属性包含选择器

database - 扫描大型 DynamoDB 表 - 大小为 1.5TB,包含 100 亿条记录