2016-09-09 15 views
5

Chciałbym mieć to, co jest zasadniczo ograniczona lista w pozycji DynamoDB. Chcę móc przedłożyć element na początek listy, a następnie upuścić przedmiot z tyłu, jeśli przekracza określony rozmiar.Dodawanie i obcinanie listy w pojedynczej operacji aktualizacji DynamoDB?

W moich przykładach będę ustawić nasadkę do 3, poprzedź element „6” i pokazać przed/po stany:

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

Ale nie mogę użyć następującego wyrażenia aktualizacji połączyć SET i REMOVE działanie na myList:

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

wykorzystaniem tej wyrażenia powoduje wyjątek (przy użyciu API dokument w Jawa):

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

Będzie działać, jeśli podzielę SET i REMOVE na dwa różne żądania aktualizacji. Czy istnieje jakaś sztuczka, która pozwoliłaby mi to zrobić w jednym wniosku?

Odpowiedz

4

Obecnie w DynamoDB nie można mieć tej samej ścieżki dokumentów w więcej niż jednej operacji, nawet jeśli są to oddzielne operacje. Dzieje się tak, ponieważ DynamoDB nie może zagwarantować kolejności wykonywania operacji w tym samym wyrażeniu aktualizacji.

+0

Tak, nie jestem zaskoczony, że nie można tego zrobić bezpośrednio podczas jednej operacji. Miałem nadzieję, że może to być jakaś sztuczka lub praca, która by to wykonała. (Wykonanie dwóch oddzielnych próśb otwiera drzwi do warunków wyścigowych, jeśli robisz równoczesne aktualizacje, chociaż na szczęście to nie jest problem w moim przypadku użycia ...) – ryryguy

+0

Tak. W większości przypadków można zapobiec warunkom wyścigu za pomocą wyrażeń warunkowych, ponownych prób i operacji atomowego dodawania i odejmowania, jeśli masz do czynienia z liczbami. –

Powiązane problemy