Node.js DynamoDB:使用aws sdk设置列表\附加不工作
我需要使用相应的键将字符串附加到dynamodb表中的字符串集。这是我用来执行updateItem的更新表达式: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
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文档只涉及最琐碎的用例。。