DynamoDB:SET list_append无法使用aws sdk

我需要添加一个string到一个使用相应的键在dynamodb表中设置的string。 这是我用来做updateItem的更新expression式:

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 

任何帮助? 谢谢

list_append可以被读为“连接”操作。 你只要给它两个清单。

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

值得一提的是,DynamoDB中的列表(和映射)不是键入的,可以存储任意数据。

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

list_append (operand, operand)

这个函数的计算结果是一个添加了新元素的列表。 您可以通过颠倒操作数的顺序将新元素追加到列表的开始或结尾。

这个问题有一个被接受的答案,帮助我解决了这个问题的一部分。 但是,我们通常希望用附加的对象而不是string来更新列表。 为此,我发现尽可能避免使用ExpressionAttributeNames是有用的。

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

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

我以为我只是把它放在那里作为另一个选项来添加或附加一个“对象”列表。 这是一个地图正在添加一个项目的名单,并为我工作得很好:

 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()} } } ] } } }; 

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

需要注意的是:1)“list_append以两个列表作为input,并将第二个列表附加到第一个列表”。 2)ExpressionAttributeValues是一个列表! 喜欢这个:

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

}

祝你好运!