2015-10-22 5 views
7

Ich muss eine Zeichenfolge an eine Zeichenfolge in einer Dynamodb-Tabelle mit dem entsprechenden Schlüssel anhängen. Dies ist der Update-Ausdruck, den ich updateItem zu tun verwenden:DynamoDB: SET list_append funktioniert nicht mit aws sdk

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

Dies funktioniert, wenn ich updateItem() mit dem aws cli. Aber wenn ich aws-sdk in Nodejs verwende, erhalte ich den Fehler:

Hilfe? Dank

+4

haben Sie versucht, den Wert zu ändern für: attrValue zu '{„L“: [{„S“:„000.989“ }]} ' –

+0

Alternativ, was ist der Typ von' Einträge' in Ihrer Tabelle? –

Antwort

17

list_append kann als eine "Verkettung" Operation gelesen werden. Sie geben es nur zwei Listen.

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

Es ist daran zu erinnern, dass Listen (und Maps) in DynamoDB nicht getippt sind und beliebige Daten speichern können.

Randbemerkung: Mit diesem Wissen, the documentation an den Anfang der Liste auf Anfügen jetzt macht Sinn:

list_append (operand, operand)

This function evaluates to a list with a new element added to it. You can append the new element to the start or the end of the list by reversing the order of the operands.

+1

Das hat es für mich getan, danke. Wichtig ist, dass list_append zwei Listen enthält: 'list_append ([list1], [list2])'. Alles andere wird ein Fehler sein. Wenn Sie also ein Objekt/eine Map übergeben (wie ich es versucht habe), müssen Sie dieses Objekt in eine Liste einfügen: [{Objekt}] – samcorcos

2

Es gibt eine akzeptierte Antwort auf diese Frage, die mich mit einem Teil dieses Problems geholfen. In der Regel möchten wir jedoch Listen mit zusätzlichen Objekten, nicht Zeichenfolgen, aktualisieren. Aus diesem Grund fand ich es nützlich, die Verwendung von ExpressionAttributeNames wenn möglich zu vermeiden.

1) Stellen Sie sicher, dass der Wert in Ihrem Element in Ihrer DynamoDB-Tabelle eine Liste ist. Machen 2) sicher, dass Sie passieren in einer Liste von Objekten (auch wenn Sie nur eine haben), kein einfaches Objekt

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

        }} 
       ] 
      }, 
+0

Vielen Dank für diese Antwort. Sie haben gesucht, wie Sie Listen mit Objekten so lange aktualisieren können – CuriousCoder

0

vielleicht wird dies jemand helfen. Ich hatte Probleme mit der Aktualisierung einer Liste und erhielt die gleiche Fehlermeldung wie das ursprüngliche Poster. Ich habe es geschafft, mein Problem zu lösen, als ich endlich die Dokumentation verstanden habe (siehe das Hinzufügen von Elementen zu einer Liste hier

Punkte zu beachten sind: 1) dass das "list_append zwei Listen als Eingabe nimmt, und die zweite Liste anfügt zum ersten. " und 2) dass ExpressionAttributeValues ​​eine Liste ist! wie folgt aus:

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

}

viel Glück!

1

Ich dachte, ich würde es einfach als eine weitere Option zum Hinzufügen oder Anhängen eines "Objekts" an eine Liste ausgeben. Es ist eine Karte ein Element in die Liste aufgenommen zu werden, und gut für mich gearbeitet:

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()} 
        } 
       } 
      ] 
     } 
    } 
};