web-dev-qa-db-fra.com

DynamoDB: SET list_append ne fonctionne pas avec aws sdk

J'ai besoin d'ajouter une chaîne à un ensemble de chaînes dans une table dynamodb en utilisant la clé correspondante. Ceci est l'expression de mise à jour que j'utilise pour faire updateItem:

  var params = {
    "TableName" : tableName,
    "Key": {
      "ID": {
        S: "20000"
      }
    },
    "UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)",
    "ExpressionAttributeNames" : {
      "#attrName" : "entries"
    },
    "ExpressionAttributeValues" : {
      ":attrValue" : {"SS":["000989"]}
    }   };

Cela fonctionne lorsque je fais updateItem () en utilisant le aws cli. Mais lorsque j'utilise aws-sdk dans nodejs, j'obtiens l'erreur:

Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M\n

De l'aide? Merci

24
void

list_append Peut être lu comme une opération "concaténée". Vous lui donnez simplement deux listes.

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

Il convient de se rappeler que les listes (et les cartes) dans DynamoDB ne sont pas typées et peuvent stocker des données arbitraires.

Note latérale: Armé de cette connaissance, la documentation sur l'ajout au début de la liste a maintenant du sens:

list_append (operand, operand)

Cette fonction évalue une liste avec un nouvel élément ajouté. Vous pouvez ajouter le nouvel élément au début ou à la fin de la liste en inversant l'ordre des opérandes.

36
chetbox

Il y a une réponse acceptée à cette question qui m'a aidé avec une partie de ce problème. Cependant, nous voulons généralement mettre à jour les listes avec des objets supplémentaires, pas des chaînes. Pour cela, j'ai trouvé utile d'éviter d'utiliser ExpressionAttributeNames si possible.

1) Assurez-vous que la valeur de votre article dans votre table DynamoDB est une liste. 2) Assurez-vous de passer une liste d'objets (même si vous n'en avez qu'un), pas un simple objet

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

                   }}
                ]
           },
6
Matthew Pitts

Je pensais que je mettrais cela là-bas comme une autre option pour ajouter ou ajouter un "objet" à une liste. C'est une carte qui ajoute un élément à la liste, et a bien fonctionné pour moi:

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

peut-être que cela aidera quelqu'un. j'avais du mal à mettre à jour une liste et recevais le même message d'erreur que l'affiche originale. j'ai réussi à résoudre mon problème lorsque j'ai finalement compris la documentation (voir l'exemple Ajouter des éléments à une liste ici http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html# Expressions.UpdateExpressions.ADD )

les points à noter sont: 1) que "list_append prend deux listes en entrée et ajoute la deuxième liste à la première". et 2) que ExpressionAttributeValues ​​est une liste! comme ça:

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

}

bonne chance!

0
Clive Sargeant