はじめに
DynamoDBの書き込み操作には、putとupdateの2通りがある。
putでもupdateでも、項目が存在しない場合には新しい項目を登録する動きになるが、updateの時に更新する対象が存在しない場合にエラーにしたかった。
対処
まずは、対象の条件をExpressionで作成する。
Map<String, AttributeValue> expressionValues = new HashMap<>();
expressionValues.put(":PARTITION_KEY", AttributeValue.builder().s("hoge").build());
expressionValues.put(":SORT_KEY", AttributeValue.builder().s("fuga").build());
Expression expression = Expression.builder()
.expression("PARTITION_KEY = :PARTITION_KEY and SORT_KEY = :SORT_KEY")
.expressionValues(expressionValues).build();
あとは、DynamoDbEnhancedClientから作成したDynamoDbTableに対してupdate要求を行う。
table.updateItem(UpdateItemEnhancedRequest.builder(Item.class)
.conditionExpression(expression).item(item).build());
UpdateItemEnhancedRequestを作成し、conditionExpression()としてExpressionを渡せば良い。
これを実行すると、Expressionに合致する項目が存在しない場合、ConditionalCheckFailedExceptionがThrowされる。
感想
まだちゃんと使ってみていないが、これを駆使すればパーティションキーとソートキー以外の項目も条件に含めることができるのではないかと思った。そうすれば結構便利な機能なのかもしれない。
ちなみに、conditionExpressionはputでも指定することができた。
(そして、動かしてみるとupdateと同じ挙動をしているように見えた・・・。)