【问题标题】:DynamoDB update item in case of item's valueDynamoDB 在项目值的情况下更新项目
【发布时间】:2017-06-09 18:54:16
【问题描述】:

我正在尝试编写一个查询,仅当值“taken”属性不等于“yes”时才更新项目。使用 dynamoDB 可以做到这一点吗?现在 dynamoDB 不检查条件。它会更新我的项目并且不检查“taken”是否不等于“yes”

  var params = {
      TableName:"usersRinger1",
      Key:{
          "userID": self.event.session.user.userId,
          "medicine": User.USERNAME.current.lastDrug
        },
        ConditionExpression: ':p <> :u',
        UpdateExpression: "set info.taken = :r, info.whatTime=:a",
        ExpressionAttributeValues:{
            ":r": "yes",
            ":a": actualTime,
            ':p' : 'info.taken',
            ':u' : "yes"
        },
        ReturnValues:"UPDATED_NEW"
    };
    docClient.update(params, function(err, data) {
  });

【问题讨论】:

    标签: node.js amazon-dynamodb


    【解决方案1】:

    我认为ConditionExpression 存在问题。 :p 是一个属性名称。它应该进入ExpressionAttributeNames

    ExpressionAttributeNames : {
        ":p" : "info.taken"
    },
    

    【讨论】:

      【解决方案2】:

      属性名称必须始终以 # 字符开头,而不是 : 用于属性值 NOT 属性名称。)您实际上是在比较条件“info.taken”和“yes”中的 2 个字符串,它们总是返回 False!而不是 'info.taken' 属性的值设置为“是”。

      您应该将条件表达式更改为以下内容:

      ConditionExpression: '#p <> :u',
      

      和你的属性值:

      ExpressionAttributeValues:{
          ':r': 'yes',
          ':a': actualTime,
          ':u' : 'yes'
          }
      

      并添加:

      ExpressionAttributeNames:{
          '#p' : 'info.taken'}
      

      来自 AWS DynamoDB 文档:

      在表达式中使用 # 字符来取消引用属性名称。

      以 : 字符开头的标记是表达式属性值,它们是运行时实际值的占位符。

      【讨论】:

        猜你喜欢
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 2017-03-01
        • 2019-02-16
        • 1970-01-01
        相关资源
        最近更新 更多