2016-11-13 4 views
0

DynamoDbでアイテムを更新しようとしています。更新の条件は、入力文字列(myValue)が文字列セット(mySet)に存在しないようにすることです。抽象的なコードは次のとおりです。DynamoDb条件式にcontains()関数の文字列セットが常にFalseと評価される

Map<String, Object> valueMap = new ValueMap().withStringSet(":val", "myValue"); 
String updateExpression = "add mySet :val "; 
String conditionExpression = "not(contains(mySet, :val))"; 
UpdateItemSpec updateItemSpec = 
    new UpdateItemSpec().withReturnValues(ReturnValue.NONE) 
     .withPrimaryKey("HashKey", "h1") 
     .withUpdateExpression(updateExpression).withValueMap(valueMap) 
     .withConditionExpression(conditionExpression); 
try { 
    myTable.updateItem(updateItemSpec); 
} catch (ConditionalCheckFailedException ccfe) { 
    System.out.println("success"); 
} 

このアイテムは既にdb内にあります。さて、mySetmyValueが存在しても、条件式は常に真と評価され、ConditionalCheckFailedExceptionには至りません。 contains()関数を使用している方法に何か問題がありますか?

文献:DynamoDb ConditionExpression Functions

+0

条件式に関係なく、アイテムが正しく追加されていますか? –

+0

はい、アイテムが正しくセットに追加されます。 – Raghav

答えて

0

これを解決した。

Map<String, Object> valueMap = new ValueMap() 
    .withStringSet(":val", "myValue") 
    .withString(":val2", "myValue"); 
String updateExpression = "add mySet :val "; 
String conditionExpression = "not(contains(mySet, :val2))"; 
UpdateItemSpec updateItemSpec = new UpdateItemSpec().withReturnValues(ReturnValue.NONE) 
    .withPrimaryKey("HashKey", "h1") 
    .withUpdateExpression(updateExpression).withValueMap(valueMap) 
    .withConditionExpression(conditionExpression); 
try { 
    myTable.updateItem(updateItemSpec); 
} catch (ConditionalCheckFailedException ccfe) { 
    System.out.println("success"); 
} 

すなわち(同じmyValue:valを文字列(:val2)とStringSetを使用した後、条件式と:val内で:val2を使用してupdate式。

これは、update式がStringSetが文字列のセットに追加されることを期待しているからですtains()関数は、StringがStringSetに存在するかどうかをStringが調べることを期待しています。

関連する問題