[英]DynamoDB : SET list_append not working using 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
有幫助嗎? 謝謝
list_append
可以讀作“連接”操作。 你只需給它兩個清單。
"UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)",
"ExpressionAttributeNames" : {
"#attrName" : "entries"
},
"ExpressionAttributeValues" : {
":attrValue" : ["000989"]
}
值得記住的是,DynamoDB中的列表(和地圖)不是鍵入的,可以存儲任意數據。
附注:有了這些知識,關於附加到列表開頭的文檔現在是有道理的:
list_append (operand, operand)
此函數將評估為添加了新元素的列表。 您可以通過反轉操作數的順序將新元素附加到列表的開頭或結尾。
在這個問題上有一個公認的答案,它幫助我解決了這個問題的一部分。 但是,我們通常希望使用其他對象而不是字符串來更新列表。 為此,我發現盡可能避免使用ExpressionAttributeNames很有用。
1)確保DynamoDB表中項目中的值是一個列表。 2)確保傳入一個對象列表(即使你只有一個),而不是一個簡單的對象
UpdateExpression: "set pObj.cObj= list_append(pObj.cObj, :obj)",
ExpressionAttributeValues: {
":obj": [
{myObject: {
property1: '',
property2: '',
property3: '',
}}
]
},
我以為我只是把它扔到那里作為向列表中添加或附加“對象”的另一個選項。 這是一個地圖被添加到列表中的項目,並為我工作得很好:
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()}
}
}
]
}
}
};
也許這會對某人有所幫助。 我正在努力更新列表,並獲得與原始海報相同的錯誤消息。 當我終於理解了文檔時,我設法解決了我的問題(請參閱這里的添加元素到列表示例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" }
]
}
}
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.