web-dev-qa-db-ja.com

DynamoDB:aws sdkを使用してSET list_appendが機能しない

対応するキーを使用して、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

何か助けは?ありがとう

24
void

_list_append_は「連結」操作として読み取ることができます。あなたはそれに2つのリストを与えるだけです。

_"UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)",
"ExpressionAttributeNames" : {
  "#attrName" : "entries"
},
"ExpressionAttributeValues" : {
  ":attrValue" : ["000989"]
}
_

DynamoDBのリスト(およびマップ)は型指定されておらず、任意のデータを格納できることを覚えておく価値があります。

サイドノート:この知識で武装して、リストの最初に追加することについて ドキュメント が意味をなすようになりました:

list_append (operand, operand)

この関数は、新しい要素が追加されたリストに評価されます。オペランドの順序を逆にすることで、リストの最初または最後に新しい要素を追加できます。

36
chetbox

この問題の一部で私を助けてくれたこの質問には受け入れられた回答があります。ただし、通常は、文字列ではなく、追加のobjectsを使用してリストを更新します。このため、可能であればExpressionAttributeNamesの使用を避けると便利です。

1)DynamoDBテーブルのアイテムの値がリストであることを確認します。 2)単純なオブジェクトではなく、オブジェクトのリストを渡します(1つしかない場合でも)。

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

                   }}
                ]
           },
6
Matthew Pitts

リストに「オブジェクト」を追加または追加するための別のオプションとして、これを捨てるだけだと思いました。これは、リストに項目を追加するマップであり、私にとってはうまくいきました。

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
Vickram

多分これは誰かを助けるでしょう。リストの更新に苦労していて、元のポスターと同じエラーメッセージが表示されていました。ドキュメントを最終的に理解したとき、なんとか問題を解決することができました(ここにリストに要素を追加する例を参照 http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html# Expressions.UpdateExpressions.ADD

注意すべき点は次のとおりです。1)「list_appendは2つのリストを入力として受け取り、2番目のリストを最初のリストに追加します。」 2)ExpressionAttributeValuesはリストです!このような:

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

}

幸運を!

0
Clive Sargeant