Festlegen eines DynamoDB Map-Eigenschaftswerts, wenn die Zuordnung noch nicht vorhanden ist

9

Wie bringt man eine Eigenschaft in eine DynamoDB-Zeile hoch? Z.B. SET address.state = "MA" für einen Artikel, wenn address noch nicht existiert?

Ich habe das Gefühl, dass ich ein Henne-und-Ei-Problem habe, weil DynamoDB es nicht erlaubt, im Voraus ein schlampiges Schema zu definieren.

Wenn address DID bereits für dieses Objekt existiert, vom Typ M (für Map), sagt mir das Internet, dass ich einen UpdateExpression wie:

ausgeben könnte

SET #address.#state = :value

mit #address , #state und :value entsprechend zugeordnet zu address , state bzw. MA .

Wenn die Eigenschaft address jedoch nicht bereits existiert, gibt dies einen Fehler:

'' ' ValidationException: Der im Update-Ausdruck angegebene Dokumentpfad ist für die Aktualisierung ungültig '' '

Also ... es scheint, ich muss entweder:

  1. Finden Sie heraus, wie Sie " address.state " (z. B. SET address = {}; SET address.state = 'MA' in einem einzigen Befehl) "upsert" können

oder

  1. Geben Sie drei (!!!) Roundtrips aus, in denen ich es versuche, SET address = {}; bei einem Fehler, und versuchen Sie es dann erneut.

Wenn letzteres ... Wie lege ich eine leere Karte fest?!?

Ugh .. Ich mag Dynamo, aber wenn ich nicht etwas offensichtliches verpasse, ist das ein bisschen verrückt ..

    
Ted Benson 13.02.2016, 08:26
quelle

3 Antworten

2

Sie können geschachtelte Attribute nicht festlegen, wenn das übergeordnete Dokument nicht vorhanden ist. Da address nicht existiert, können Sie das Attribut province nicht darin setzen. Sie können Ihr Ziel erreichen, indem Sie address beim Erstellen des Elements auf eine leere Map setzen. Anschließend können Sie die folgenden Parameter verwenden, um ein Update für ein Attribut address.province noch nicht vorhanden zu konditionieren.

%Vor%

Übrigens musste ich Staat durch Provinz ersetzen, da Staat ein reserviertes Wort ist.

    
Alexander Patrikalakis 05.02.2017 04:47
quelle
0

Eine andere völlig andere Methode besteht darin, einfach den Knoten address zu erstellen, wenn Sie das übergeordnete Dokument an erster Stelle erstellen. Angenommen, Sie haben einen Hash-Schlüssel von id , können Sie Folgendes tun:

%Vor%

Damit können Sie einfach den address.state Wert setzen, da die address Karte bereits existiert:

%Vor%     
leftclickben 01.04.2017 03:11
quelle
0

Sie können es mit zwei Rundreisen machen, die erste setzt bedingt eine leere Karte für address , wenn sie noch nicht existiert, und die zweite setzt state :

%Vor%

Dann:

%Vor%     
leftclickben 01.04.2017 03:07
quelle

Tags und Links