2016-09-09 3 views
5

Ich hätte gerne eine Liste, die im Grunde eine gekappte Liste in einem DynamoDB-Element ist. Ich möchte in der Lage sein, ein Element an den Anfang der Liste voranzustellen, und dann das Element von der Rückseite ablegen, wenn es eine bestimmte Größe überschreitet.Liste hinzufügen und abschneiden in einzelnen DynamoDB Update-Vorgang?

In meinen Beispielen ich die Kappe auf 3 gesetzt werden, prepend das Element „6“ und zeigen vor/nach Staaten:

    { } -> { "myList": [6] } 
     { "myList": [1] } -> { "myList": [6, 1] } 
{ "myList": [3, 2, 1] } -> { "myList": [6, 3, 2] } 

Aber ich kann nicht einen Mähdrescher verwenden Sie das folgende Update zum Ausdruck SET und REMOVE Betrieb auf myList:

# (":empty" set to an empty list in the value map) 
SET myList = list_append(:v, if_not_exists(myList, :empty)) REMOVE myList[3] 

der Versuch, diesen Ausdruck führt zu einer Ausnahme zu verwenden (das Dokument API in Java verwenden):

Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths 

Es funktioniert, wenn ich die SET und REMOVE in zwei verschiedene Update-Anfragen aufgeteilt habe. Gibt es einen Trick, der es mir in einer einzigen Anfrage erlauben würde?

Antwort

4

Derzeit können Sie in DynamoDB nicht denselben Dokumentpfad in mehr als einer Operation verwenden, auch wenn es sich um separate Operationen handelt. Dies liegt daran, dass DynamoDB die Reihenfolge der Ausführungsvorgänge im selben Aktualisierungsausdruck nicht garantieren kann.

+0

Ja, ich bin nicht überrascht, dass es nicht direkt in einer einzigen Operation durchgeführt werden kann. Ich hatte gehofft, dass es einen Trick oder eine Arbeit geben könnte, die das erreichen würde. (Wenn du zwei separate Anfragen machst, öffnet sich auch die Tür zu den Rennbedingungen, wenn du gleichzeitig Updates machst, obwohl das zum Glück in meinem Anwendungsfall kein Problem ist ...) – ryryguy

+0

Yeah. In den meisten Fällen können Sie Race-Bedingungen durch bedingte Ausdrücke, Wiederholungen und die atomaren Operationen zum Hinzufügen und Subtrahieren verhindern, wenn Sie mit Zahlen arbeiten. –