2012-10-25 9 views
5

Używam DynamoDB do przechowywania zdarzeń. Są przechowywane w 1 tabeli zdarzeń przy użyciu klucza "Source ID" i klucza zakresu "version". Za każdym razem, gdy pojawia się nowe zdarzenie dla źródła, chcę dodać nowy element z identyfikatorem źródłowym i zwiększoną wersją nr.DynamoDB: Jak wykonać zapis warunkowy w celu wymuszenia unikalnego klucza Hash + Range

Czy można określić zapis warunkowy, aby duplikat (ten sam skrót i ten sam klucz zakresu) nigdy nie istniał? A jeśli tak, to jak byś to zrobił?

Zrobiłem to z powodzeniem na stołach z tylko klawisz krzyżyka:

Map<String, ExpectedAttributeValue> expected = new HashMap<String, ExpectedAttributeValue>(); 
expected.put("key", new ExpectedAttributeValue().withExists(false)); 

ale nie wiem, jak radzić sobie z klawiszy skrótu + range ....

+1

Naprawdę stare pytanie, ale dynamodb ma wersję atomowej inkrementacji, spójrz na to (głównie dla ludzi, którzy się tu kończą) –

+0

Dokumentacja Atomic tutaj: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/ API_UpdateItem.html – Deemoe

Odpowiedz

3

nie wiem Java SDK dobrze ale można podać "Exist = False" zarówno na range_key i hash_key.

Może lepszym pomysłem może być użycie znacznika czasu zamiast numeru wersji? W przeciwnym razie istnieją również techniki generowania unikalnych identyfikatorów.

+0

Dzięki za napiwek!Spróbuję określić "Exist = False" na kluczu zakresu i krzyżyku. Po prostu z ciekawości, dlaczego zaproponowałeś, że lepiej byłoby użyć znacznika czasu zamiast numeru wersji? – stikkos

+0

Tylko po to, aby oszczędzić ci pokolenia "id" :) – yadutaf

+0

Próbowałem tego, ale nadal nie mogę tego uruchomić .... Otrzymuję błąd: "Nie można oczekiwać, że atrybut będzie miał określoną wartość podczas oczekiwania to nie istnieje ". Dowolny pomysł?? – stikkos

2

Próbowałem wymusić unikalną kombinację kluczy skrótu i ​​zakresu i natrafiłem na ten wpis. Odkryłem, że nie odpowiedział on w pełni na moje pytanie, ale z pewnością wskazał mi właściwy kierunek. Jest to próba uporządkowania luźnych końców.

Wygląda na to, że DynamoDB faktycznie wymusza unikalną kombinację klawisza skrótu i ​​zakresu według projektu. Cytuję

„Wszystkie pozycje w tabeli musi mieć wartość atrybutu klucza podstawowego i Amazon DynamoDB gwarantuje, że produkt wart tej nazwy jest unikalny”

z http://aws.amazon.com/dynamodb/ w sekcji z nagłówkiem klucz podstawowy.

W moich własnych testach używając putItem z aws-sdk dla nodejs udało mi się opublikować dwa identyczne elementy bez generowania błędu. Kiedy sprawdziłem bazę danych, tylko jeden element został wstawiony. Wygląda na to, że drugie wywołanie metody putItem z tą samą kombinacją klucza i zakresu jest traktowane jak aktualizacja oryginalnego elementu.

Również otrzymałem komunikat "Nie można oczekiwać, że atrybut ma określoną wartość, oczekując, że nie istnieje", gdy próbowałem ustawić opcję exist = false na kluczu mieszającym i klucz zakresu z ustawionymi wartościami. Aby rozwiązać ten problem, usunąłem wartość pod oczekiwanym hashiem i kluczem zakresu i podczas próby dwukrotnego wstawienia tego samego klucza wystąpił błąd sprawdzania poprawności.

Więc moje polecenie insert wygląda następująco (będą różne dla Java, ale mam nadzieję, że masz pomysł)

{  "TableName": "MyTableName", 

"Item"   : { 

          "HashKeyFieldName": { 

            "S": HashKeyValue 

          }, 

          "RangeKeyFieldName": { 

            "N": currentTime.getTime().toString() 

          }, 

          "OtherField": { 

            "N": "61404032632" 

          } 

         }, 

"Expected": { 

         "HashKeyFieldName"  : { "Exists" : false}, 
         "RangeKeyFieldName"  : { "Exists" : false} 

        } 

}

Podczas gdy początkowo starałem się zrobić warunkową wkładkę do sprawdzenia jeśli wartość hasha i wartość zakresu były takie same jak te, które próbowałem wstawić, teraz po prostu muszę sprawdzić, czy HashField i RangeField w ogóle istnieją. Jeśli istnieją, oznacza to, że aktualizuję element zamiast wstawiać.

Powiązane problemy