2017-12-01 15 views
2

条件DynamoDBのテーブルのエントリ挿入:二つの条件

  1. (ハッシュキー、rangekey)の組み合わせがすでにテーブルに存在しないはず

  2. 新しく挿入された範囲キー値がより1でなければならないし今まで最大の範囲のキー。

    http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExpectedAttributeValue.html

    をしかし、私は、一度に1つの条件を置くことができます。

私はexpectedValueAttributeを使用しようとしているが、ここで指定しました。どのように両方の条件を実施するのですか?

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

これは、上記の条件1のみを満たします。

+0

あなたはこの 'ExpectedAttributeValue() .withValue(新しいAttributeValueの()。withN( "20")) .withComparisonOperator(ComparisonOperator.LT)などの比較演算子** **何かを試してみましたが、'この例にアクセスしてくださいおそらくこれはhttps://aws.amazon.com/blogs/developer/using-improved-conditional-writes-in-dynamodb/に役立ちます –

答えて

0

既存の範囲キーの最大値を最初に照会することなく比較することができないため、これを2つの手順で行う必要があります。

1)キーあなたの特定のパーティション

2)返されたキーは、正確に一つの小さい場合は、持っている1でその返された範囲のキーの比較のための最高の範囲のキーで項目を取得し、新しいアイテムを置きます。 (実際にアイテムが存在するかどうかを確認する必要はありません。クエリが既に存在しないことが確認されているためです)。

DynamoDBは、指定されたパーティションの範囲キー順でアイテムを格納します。また、指定したパーティションのアイテムもこの順序で返します。範囲キーが数値の場合、ソート順は数値で、パーティションの最終結果が最初のものでないようにします。 ScanIndexForwardを使用してクエリの順序を尊重し、最初の項目を取ることができます。

クエリは次のようになります。

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); 

項目の範囲キーはアイテムを入れて、新しい項目の範囲のキーよりも1小さい場合。アイテムリストが空の場合(つまり、パーティションキーがまだ存在しない場合)は、動作を考慮する必要があります。

関連する問題