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
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.
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: '',
}}
]
},
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()}
}
}
]
}
}
};
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!