DynamoDB:SET list_append无法使用aws sdk

时间:2015-10-22 10:07:23

标签: node.js amazon-web-services 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"]}
    }   };

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

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

有任何帮助吗? 感谢

4 个答案:

答案 0 :(得分:28)

list_append可以被理解为"连接"操作。你只需给它两个清单。

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

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

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

  

list_append (operand, operand)

     

此功能评估为列表   添加了一个新元素。您可以将新元素附加到   通过颠倒操作数的顺序来开始或结束列表。

答案 1 :(得分:5)

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

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

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

                   }}
                ]
           },

答案 2 :(得分:2)

我想我只是把它扔出去作为添加或附加"对象的另一种选择"到列表。它是一个将项目添加到列表中的地图,对我来说效果很好:

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

答案 3 :(得分:0)

也许这会对某人有所帮助。我正在努力更新列表,并获得与原始海报相同的错误消息。当我终于理解了文档时,我设法解决了我的问题(请参阅此处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" }
    ]
}

}

祝你好运!