2017-08-13 1 views
0

Ich habe eine DynamoDB und möchte versuchen, einige Einträge zu aktualisieren und fügen Sie diejenigen ein, die nicht existieren. Meine aktuellen Code sieht wie folgt aus:DynamoDB-Java schreiben wenn existiert Update wenn nicht

updateItemSpec = new UpdateItemSpec() 
       .withPrimaryKey(ITable.ID, 
       request.getID().getValue()) 
       .withUpdateExpression(updatedExpressionSetString) 
       .withNameMap(nameMap) 
       .withValueMap(valueMap) 
try { 
     table.updateItem(updateItemSpec); 
} 

Wo die updateExpression ist:

SET supply.#var0 = 
if_not_exists(supply.#var0,:default) + :val0, 
date = :dateVal 

Das alles funktioniert gut, bis ein einen Eintrag erreichen, in dem der Primärschlüssel noch nicht vorhanden ist. Wenn dies geschieht dieser Code die Ausnahme auslöst:

Der in dem Update Ausdruck zur Verfügung gestellt Dokumentpfad ist ungültig für Update (Service: AmazonDynamoDBv2; Statuscode: 400; Fehlercode: Validation;)

Meine Frage ist: Wie Korrigiere ich diesen Code, damit er bei Erreichen eines Primärschlüssels eingefügt wird, wenn er einen Primärschlüssel erreicht, der bereits existiert, ohne dass ein zusätzlicher Lesevorgang erforderlich ist, um zu prüfen, ob er bereits existiert?

+0

Haben Sie versucht, dies mit einer Tabelle auszuführen, die keinen Primärschlüssel hat? – efekctive

+0

Nun, die Tabelle ist leer als Standard, aber ich muss immer noch den Primärschlüssel behalten oder sonst bekomme ich einen _cannot Nullschlüssel für GetItem, DeleteItem oder UpdateItem error_ – MatthewO

+0

Ich meine versuchen, das Problem zu isolieren. Versuchen Sie ein einfaches Update, wenn es funktioniert, dann wissen Sie, das Problem ist, wenn es existiert. Ich habe jetzt keinen Zugriff auf meine Java-Umgebung – efekctive

Antwort

0

Ich konnte mich nicht erinnern, ob die PK obligatorisch war. Es ist. Aus der Java-Dokumentation:

if_not_exists (path, Operand) - wenn der Artikel nicht ein Attribut auf dem angegebenen Pfad enthält, wertet if_not_exists zu Operanden; Andernfalls wird der Pfad ausgewertet. Sie können diese Funktion verwenden, um zu vermeiden, ein Attribut zu überschreiben, das bereits in dem Element vorhanden sein kann.

Aber diese

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

heißt es möglich ist.

Der Wert scheint nicht der PK zu sein. Arbeitet der Upsert auf dem Tisch ohne einen Ausdruck?

Verwandte Themen