DynamoDB:SET list_append使用aws sdk无法正常工作

voi*_*oid 19 amazon-web-services node.js amazon-dynamodb aws-sdk

我需要使用相应的键将字符串附加到dynamodb表中的字符串集.这是我用来执行updateItem的Update表达式:

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

这在我使用aws cli执行updateItem()时有效.但是当在nodejs中使用aws-sdk时,我收到错误:

Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M\n
Run Code Online (Sandbox Code Playgroud)

有帮助吗?谢谢

che*_*box 31

list_append可以读作"连接"操作.你只需给它两个清单.

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

值得记住的是,DynamoDB中的列表(和地图)不是键入的,可以存储任意数据.

附注:有了这些知识,关于附加到列表开头的文档现在是有道理的:

list_append (operand, operand)

此函数将评估为添加了新元素的列表.您可以通过反转操作数的顺序将新元素附加到列表的开头或结尾.

  • 为我做到了,谢谢。需要注意的重要一点是 list_append 接受两个列表:`list_append([list1], [list2])`。其他任何事情都会出错。因此,如果您传递一个对象/地图(正如我试图做的那样),您需要将该对象包装在一个列表中:[{ object }] (3认同)

Mat*_*tts 5

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

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

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

                   }}
                ]
           },
Run Code Online (Sandbox Code Playgroud)