【问题标题】:DynamoDB : SET list_append not working using aws sdkDynamoDB:SET list_append 无法使用 aws sdk
【发布时间】:2016-01-21 13:57:10
【问题描述】:

我需要使用相应的键将字符串附加到 dynamodb 表中的字符串集。这是我用来做 updateItem 的更新表达式:

  var params = {
    "TableName" : tableName,
    "Key": {
      "ID": {
        S: "20000"
      }
    },
    "UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)",
    "ExpressionAttributeNames" : {
      "#attrName" : "entries"
    },
    "ExpressionAttributeValues" : {
      ":attrValue" : {"SS":["000989"]}
    }   };

这在我使用 aws cli 执行 updateItem() 时有效。但是在 nodejs 中使用 aws-sdk 时,出现错误:

Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M\n

有什么帮助吗? 谢谢

【问题讨论】:

  • 您是否尝试过将 :attrValue 的值更改为 {"L":[{"S":"000989"}]}
  • 或者,您的表中entries 的类型是什么?

标签: node.js amazon-web-services amazon-dynamodb aws-sdk


【解决方案1】:

list_append 可以理解为“连接”操作。你只需给它两个列表。

"UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)",
"ExpressionAttributeNames" : {
  "#attrName" : "entries"
},
"ExpressionAttributeValues" : {
  ":attrValue" : ["000989"]
}

值得记住的是,DynamoDB 中的列表(和地图)没有类型,可以存储任意数据。

旁注:有了这些知识,the documentation 附加到列表的开头现在是有意义的:

list_append (operand, operand)

这个函数的计算结果是一个列表 添加了一个新元素。您可以将新元素附加到 通过反转操作数的顺序来开始或结束列表。

【讨论】:

  • 这对我有用,谢谢。需要注意的重要一点是 list_append 包含两个列表:list_append([list1], [list2])。其他任何事情都会出错。因此,如果您传递一个对象/地图(正如我试图做的那样),您需要将该对象包装在一个列表中:[{ object }]
【解决方案2】:

这个问题有一个公认的答案,它帮助我解决了这个问题的一部分。但是,我们通常希望使用额外的对象而不是字符串来更新列表。为此,我发现尽可能避免使用 ExpressionAttributeNames 很有用。

1) 确保 DynamoDB 表中的项目中的值是一个列表。 2) 确保你传入一个对象列表(即使你只有一个),而不是一个简单的对象

           UpdateExpression: "set pObj.cObj= list_append(pObj.cObj, :obj)",
           ExpressionAttributeValues: {
               ":obj": [
                   {myObject: {
                       property1: '',
                       property2: '',
                       property3: '',

                   }}
                ]
           },

【讨论】:

  • 非常感谢您的回答。一直在寻找如何用对象更新列表
  • 关键是您要添加的对象必须包装在列表本身中。谢谢。
【解决方案3】:

我想我只是把它作为另一种添加或附加“对象”到列表的选项。这是一张被添加到列表中的地图,对我来说效果很好:

var upsertExpr = (obj.comments == undefined) ? " :attrValue" : "list_append(#attrName, :attrValue)";

var params = {
    TableName: 'tableName',
    Key: {
        'id': {'S': id},
    },
    UpdateExpression : "SET #attrName = " + upsertExpr,
    ExpressionAttributeNames : {
      "#attrName" : "comments"
    },
    ExpressionAttributeValues : {
      ":attrValue" : {
            "L": [
                { "M" : 
                    {
                        "comment": {"S": comment},
                        "vote": {"N": vote.toString()}
                    }
                }
            ]
        }
    }
};

【讨论】:

  • 非常感谢!这两天我一直在想办法解决这个问题。不幸的是,AWS 文档只涵盖了最琐碎的用例..
【解决方案4】:

也许这会对某人有所帮助。我正在努力更新列表,并收到与原始海报相同的错误消息。当我终于理解文档时,我设法解决了我的问题(请参阅此处的将元素添加到列表示例http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.ADD

需要注意的一点是:1)“list_append 将两个列表作为输入,并将第二个列表附加到第一个列表。” 2) ExpressionAttributeValues 是一个列表!像这样:

{
":vals": {
    "L": [
        { "S": "Screwdriver" },
        {"S": "Hacksaw" }
    ]
}

}

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2023-04-07
    • 2018-12-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多