2015-09-25 2 views
14

Lassen Sie sich sagen, dass ich Datensätze mit folgenden Struktur in DynamoDB an Speicherung:Ist es möglich, ein bedingtes Put oder Update in DynamoDB durchzuführen?

{  
    "id": "57cf5b43-f9ec-4796-9de6-6a50f556cfd8", 
    "created_at": "2015-09-18T13:27:00+12:00", 
    "count": 3 
} 

Jetzt ist es möglich, die folgend in einer Anfrage zu erreichen:

  • , wenn der Datensatz mit bestimmten id nicht existiert es sollte mit count = 1
  • erstellt werden, wenn der Datensatz für diesen id existiert, wird der Zähler aktualisiert.

Derzeit mache ich eine Abfrage, ob der Datensatz vorhanden zu überprüfen und je nach dem Ergebnis kann ich ein put oder ein update. Es wäre schön, das zu einer einzigen Operation zusammenzufalten.

Antwort

11

Sie können dies mit UpdateItem API und dem UpdateExpression wegen Ihres Anwendungsfalles tun. Da count hier eine Number Typ sein wird, können Sie die SET oder ADD Ausdrücke verwenden:

Die Dokumentation für ADD sagt Ihnen, dass Sie es für Number Typen (Hervorhebung von mir) verwenden können:

  • HINZUFÜGEN - Fügt dem Element den angegebenen Wert hinzu, wenn das Attribut noch nicht existiert. Wenn das Attribut nicht vorhanden ist, dann hängt das Verhalten von ADD auf dem Datentyp des Attributs:

    • Wenn das vorhandene Attribut eine Zahl ist, und wenn Wert ist auch eine Zahl, dann Wert ist mathematisch zum vorhandenen Attribut hinzugefügt. Wenn Wert eine negative Zahl ist, wird sie vom vorhandenen Attribut subtrahiert.

    Wenn Sie einen Zahlenwert für ein Element zu erhöhen oder zu verringern verwenden ADD, die vor dem Update nicht existieren, verwendet DynamoDB 0 als Anfangswert. Wenn Sie ADD für ein vorhandenes Element verwenden, um einen Attributwert zu erhöhen oder zu verringern, der vor der Aktualisierung nicht vorhanden war, verwendet DynamoDB 0 als Anfangswert. Angenommen, das Element, das Sie aktualisieren möchten, hat kein Attribut mit dem Namen itemcount, aber Sie möchten dennoch die Zahl 3 zu diesem Attribut HINZUFÜGEN. DynamoDB erstellt das Attribut itemcount, legt den Anfangswert auf 0 fest und fügt schließlich 3 hinzu. Das Ergebnis wird ein neues itemcount Attribut in der Position sein, mit einem Wert von 3.

Für Ihr Beispiel könnten Sie Ihre UpdateExpressionADD #c :n sein, wo :n eine ExpressionAttributeValue des Number Typ hat, 1 ist der Wert und #c hat die ExpressionAttributeName Ersetzung für count. Sie müssen einen Platzhalter für count verwenden, da es sich um eine reserved word handelt.

Weitere Beispiele auf der Modifying Items and Attributes with Update Expressions

7

Was ich nicht war in meiner Frage nicht erwähnt, dass ich die created_at die count steigen für nachfolgende Ereignisse ohne Änderung wollte. Meine letzte Arbeit UpdateInput sieht so aus:

{ 
    Key: { 
    id: { 
     S: "some_unique_id" 
    } 
    }, 
    TableName: "test", 
    ExpressionAttributeNames: { 
    #t: "created_at", 
    #c: "count" 
    }, 
    ExpressionAttributeValues: { 
    :t: { 
     S: "2015-09-26T15:58:57+12:00" 
    }, 
    :c: { 
     N: "1" 
    } 
    }, 
    UpdateExpression: "SET #t = if_not_exists(#t, :t) ADD #c :c" 
}