我需要使用相应的键将字符串附加到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
有任何帮助吗? 感谢
答案 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" }
]
}
}
祝你好运!