簡體   English   中英

DynamoDB:SET list_append使用aws sdk無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM