DynamoDB:SET list_append 无法使用 aws sdk

DynamoDB : SET list_append not working using aws sdk

我需要使用相应的键将字符串附加到 dynamodb table 中的字符串集。这是我用来执行 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

有什么帮助吗? 谢谢

list_append可以读作"concatenate"操作。你只要给它两个列表。

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

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

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

list_append (operand, operand)

This function evaluates to a list with a new element added to it. You can append the new element to the start or the end of the list by reversing the order of the operands.

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

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

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

                   }}
                ]
           },

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

需要注意的要点是:1) "list_append takes two lists as input, and appends the second list to the first." 和 2) ExpressionAttributeValues 是一个列表!像这样:

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

}

祝你好运!

我想我应该把它作为向列表添加或附加 "object" 的另一种选择。这是一张正在向列表中添加项目的地图,对我来说效果很好:

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