2014-10-21 11 views
10

Próbuję użyć nowego Amazon DynamoDB JSON API, aby dodać/zastąpić pary klucz-wartość w atrybucie JSON o nazwie "document". Idealnie, chciałbym po prostu uporządkować moje wywołania zapisu, aby wysłać pary KV, aby dodać do atrybutu, i aby Dynamo utworzył atrybut, jeśli jeszcze nie istnieje dla danego klucza podstawowego. Jednakże gdy próbuję to z zaledwie prosty UpdateItemSpec:Interfejs API DynamoDB: Jak mogę utworzyć żądanie "Dodaj atrybut JSON, jeśli nie jest obecny"?

PrimaryKey primaryKey = new PrimaryKey("key_str", "mapKey"); 
ValueMap valuesMap = new ValueMap().withLong(":a", 1234L).withLong(":b", 1234L); 
UpdateItemSpec updateSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withUpdateExpression("SET document.value1 = :a, document.value2 = :b"); 
updateSpec.withValueMap(valuesMap); 
table.updateItem(updateSpec); 

uzyskać com.amazonaws.AmazonServiceException: The document path provided in the update expression is invalid for update, czyli DynamoDB nie mógł znaleźć dany atrybut o nazwie „dokument”, do którego należy zastosować tę aktualizację.

udało mi się zbliżyć tę funkcjonalność z serii rozmów:

try { 
    // 1. Attempt UpdateItemSpec as if attribute already exists 
} catch (AmazonServiceException e) { 
    // 2. Confirm the exception indicated the attribute was not present, otherwise rethrow it 
    // 3. Use a put-if-absent request to initialize an empty JSON map at the attribute "document" 
    // 4. Rerun the UpdateItemSpec call from the above try block 
}  

To działa, ale jest mniej niż idealna, ponieważ będzie to wymagało 3 wywołań DynamoDB każdym razem dodać nowy klucz podstawowy do stół. Eksperymentowałem trochę z funkcją attribute_not_exists, którą można użyć w Update Expressions, ale nie udało mi się jej uruchomić tak, jak chcę.

Każdy guru Dynama ma jakieś pomysły na to, jak/czy można to zrobić?

Odpowiedz

4

Otrzymałem odpowiedź od Amazon Support, że nie jest to możliwe za pomocą jednego połączenia. Zaproponowali zmniejszenie liczby wywołań przy dodawaniu atrybutu nowego klucza podstawowego z 3 na 2, przy użyciu wymaganej mapy JSON w żądaniu "włackaj jeśli nieobecni" zamiast pustej mapy.

+3

Naprawdę chciałbym zobaczyć kod tutaj, ponieważ stoję przed tym samym wyzwaniem. DynamoDB API uderza mnie naiwnością. –

+1

Czy masz pomysł, czy ta odpowiedź jest nadal aktualna? (mając nadzieję, że coś zmienili od 2014 r.) – Nadine

Powiązane problemy