Node.js DynamoDB:使用aws sdk设置列表\附加不工作

Node.js DynamoDB:使用aws sdk设置列表\附加不工作,node.js,amazon-web-services,amazon-dynamodb,aws-sdk,Node.js,Amazon Web Services,Amazon Dynamodb,Aws Sdk,我需要使用相应的键将字符串附加到dynamodb表中的字符串集。这是我用来执行updateItem的更新表达式: var params = { "TableName" : tableName, "Key": { "ID": { S: "20000" } }, "UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)", "Ex

我需要使用相应的键将字符串附加到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更新Item()时,这一点就起作用了。但是在nodejs中使用aws sdk时,我得到了一个错误:

Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M\n
有什么帮助吗?
谢谢

list\u append
可以被理解为一个“串联”操作。你只要给它两张单子

"UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)",
"ExpressionAttributeNames" : {
  "#attrName" : "entries"
},
"ExpressionAttributeValues" : {
  ":attrValue" : ["000989"]
}
值得记住的是,DynamoDB中的列表(和映射)不是类型化的,可以存储任意数据

旁注:有了这些知识,在列表的开头加上以下内容就有意义了:

list\u追加(操作数,操作数)

此函数的计算结果为一个列表 添加了一个新元素。可以将新元素附加到 通过颠倒操作数的顺序来开始或结束列表


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

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

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

                   }}
                ]
           },

也许这会对某人有所帮助。我正在努力更新一个列表,并且收到了与原始海报相同的错误消息。当我最终理解了文档时,我成功地解决了我的问题(请参见此处向列表添加元素的示例)

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

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


祝你好运

我想我应该把它作为向列表中添加或追加“对象”的另一个选项扔掉。这是一个正在向列表中添加项目的地图,对我来说效果很好:

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

您是否尝试过将:attrValue的值更改为
{“L”:[{“S”:“000989”}]}
或者,您的表中的
条目的类型是什么?这对我来说很有用,谢谢。需要注意的重要一点是,list\u append包含两个列表:
list\u append([list1]、[list2])
。其他任何东西都会出错。因此,如果您传递一个对象/映射(正如我试图做的那样),您需要将该对象包装在一个列表中:[{object}]非常感谢您的回答。搜索如何用对象更新列表已经很久了,非常感谢!我两天来一直在想这个问题。不幸的是,AWS文档只涉及最琐碎的用例。。