2016-03-01 35 views
8

Chciałbym "uzupełnić" dokument w DynamoDB. To znaczy, chciałbym podać klucz i zestaw par pola/wartości. Jeśli nie istnieje żaden dokument z tym kluczem, nie będę go tworzyć z tym kluczem i podanymi parami klucz/wartość. Jeśli istnieje dokument z tym kluczem, chcę, aby określone przeze mnie pola były ustawione na określone wartości (jeśli te pola wcześniej nie istniały, należy je dodać). Wszelkie inne, nieokreślone pola w istniejącym dokumencie należy pozostawić w spokoju.Czy można zagnieżdżać pola zagnieżdżone w DynamoDB?

Wygląda na to, że mogę to zrobić całkiem dobrze z rozmową UpdateItem, gdy ustawione pary pól/wartości są polami najwyższego poziomu. Jeśli mam struktury zagnieżdżone, UpdateItem będzie działało, aby ustawić zagnieżdżone pola, o ile struktura istnieje. Innymi słowy, jeśli mój istniejący dokument ma numer "foo": {}, mogę pomyślnie ustawić "foo.bar": 42.

Jednak nie wydaje mi się, aby ustawić "foo.bar": 42, jeśli nie ma już obiektu foo (jak w przypadku, gdy w ogóle nie ma dokumentu z określonym polem, a mój "upsert" zachowuje się jak "wstaw"

Znalazłem a discussion na forach AWS sprzed kilku lat, co wydaje się sugerować, że to, co chcę zrobić, nie może być zrobione, ale mam nadzieję, że to się ostatnio zmieniło, a może ktoś wie o sposób to zrobić:

+1

Aby dać kolejny DATAPOINT, spojrzałem to w maju 2015 (ish) i ten sam problem, o którym wspomniałeś, nadal istniał. Nie byłem w stanie osiągnąć celu zagnieżdżonego pola, więc musiałem zmienić podejście do problemu i sposobu przechowywania danych. – mkobit

+0

@kkobit dzięki za twój punkt danych; to jest też wniosek, do którego doszedłem. Ponieważ moje dane miały ustaloną liczbę poziomów zagnieżdżonych, w końcu zapisałem je spłaszczone, z polami o nazwie 'foo_bar', a następnie dodałem kod marshalling/unmarshalling do mojej warstwy DAO, aby je przetłumaczyć. To jest ból, ale wydaje się, że działa wystarczająco dobrze (przynajmniej na razie). – pkaeding

+2

Ten sam numer rok później. Denerwujące jest to, że Dynamo nie rzuca błędu, po prostu nie zapisuje tej części drzewa danych. – Jelling

Odpowiedz

0

UpdateItem Zachowuje się jak operacja "upsert": element jest aktualizowany, jeśli istnieje w tabeli , ale jeśli nie, dodano nowy element (wstawiony). http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

+2

Tak, przeczytałem to. Ale jeśli przeczytasz moje pytanie, nie będę w stanie przywrócić obiektów zagnieżdżonych. – pkaeding

+0

Użyłem go z obiektami zagnieżdżonymi i działał (w/DynamoDBMapper). http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html – Neil

0

że ("foo.bar": 42) można osiągnąć za pomocą poniższego zapytania:

table.update_item(Key = {'Id' : id}, 
       UpdateExpression = 'SET foo = :value1', 
       ExpressionAttributeValues = {':value1': {'bar' : 42}} 
      ) 

Hope this helps :)

+0

, ale jeśli wartość początkowa 'foo' ma inne klucze, oprócz' ' wartość baru, którą aktualizujesz, czy nie zostaną utracone? Na przykład, jeśli początkowa wartość to '{foo: {biz: 33, bar: 0}}' i chcesz zmienić tylko 'foo.bar', pozostawiając resztę obiektu' foo' bez zmian, czy to zadziała? – pkaeding

+0

Odpowiedziałem na pytanie podobne do tego. https://stackoverflow.com/questions/35569733/how-to-adding-an-empty-or-data-map-in-dynamodb/46791740#46791740 Proszę to sprawdzić i skomentować, jeśli to działa. – manojpt