2017-12-01 4 views
2

Bedingungen:einen Eintrag in DynamoDB Tabelle mit zwei Bedingungen Legen

  1. (HashKey, rangekey) sollte Kombination existiert nicht bereits in der Tabelle

  2. Neu eingefügt Bereich muss Schlüsselwert eine mehr als die maximale ReichweiteKey bis jetzt.

Ich versuche expectedValueAttribute hier angegeben zu verwenden: kann http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExpectedAttributeValue.html

aber ich habe nur zu einem Zeitpunkt eine Bedingung. Wie erzwingen Sie beide Bedingungen?

Map<String, ExpectedAttributeValue> expectedAttributes = ... 
    .put(hashKey, new ExpectedAttributeValue(false)) 
    .put(rangeKey, new ExpectedAttributeValue(false)) 
    .build(); 

Dies erfüllt nur die obige Bedingung 1.

+0

Haben Sie versucht, das ** Vergleichsoperator ** so etwas wie dieses 'ExpectedAttributeValue() .withValue (neuer Attributwert(). Mit N ("20")) .withComparisonOperator (ComparisonOperator.LT)' Bitte gehen Sie zu diesem Beispiel vielleicht hilft das https://aws.amazon.com/blogs/developer/using-improved-conditional-writes-in-dynamodb/ –

Antwort

0

Da Sie den Maximalwert des vorhandenen Bereichsschlüssels nicht ohne vorherige Abfrage vergleichen können, müssen Sie dies in zwei Schritten tun.

1) Holen Sie sich das Element mit der höchsten Reichweite Schlüssel für Ihre bestimmten Partition Schlüssel

2) Vergleichen Sie die zurückgegeben Bereich Schlüssel mit den man haben, wenn der zurückgegebene Schlüssel genau ein kleiner, setzen Sie das neue Element. (Beachten Sie, dass Sie nicht prüfen müssen, ob der Artikel bereits existiert - da die Anfrage bereits bestätigt wurde, existiert er nicht).

DynamoDB speichert Ihre Artikel in der Bereichsschlüsselreihenfolge für eine bestimmte Partition und gibt Ihre Artikel für eine bestimmte Partition in dieser Reihenfolge zurück. Wenn der Bereichsschlüssel eine Zahl ist, ist die Sortierreihenfolge numerisch, und Sie möchten, dass das letzte Ergebnis für Ihre Partition nicht das erste ist. Sie können die Reihenfolge Ihrer Abfrage mit ScanIndexForward verehren und dann das erste Element übernehmen.

Die Abfrage wäre:

Table table = dynamoDB.getTable("YOUR_TABLE"); 

QuerySpec spec = new QuerySpec() 
    .withKeyConditionExpression("hash = :v_hash") 
    .withValueMap(new ValueMap() 
     .withString(":v_hash", "your_hash") 
    .withScanIndexForward(false) 
    .setMaxResultSize(1); 

ItemCollection<QueryOutcome> items = table.query(spec); 

Wenn das Element Bereich Schlüssel ist ein kleiner als der neue Schlüssel-Item-Bereich, das Element setzen. Beachten Sie, dass Sie das Verhalten berücksichtigen sollten, wenn die Elementliste leer ist (d. H. Der Partitionsschlüssel ist noch nicht vorhanden).

Verwandte Themen