DynamoDB表达式 - 多个ExpectedAttributeValues比较

时间:2017-02-06 07:25:43

标签: java amazon-web-services amazon-dynamodb

我正在尝试使用java sdk来使用DynamoDB的DynamoDBSaveExpression。

我正处于尝试模拟以下两种情况的位置:

1)如果表中存在该项,则强制执行保存表达式限制DATE1,DATE2和DATE3(请参阅下面的代码)。

2)如果表中不存在该项,请尝试插入它。

到目前为止,这是我的代码:

        ExpectedAttributeValue date1 = new ExpectedAttributeValue()
                .withComparisonOperator(ComparisonOperator.LE)
                .withValue(new AttributeValue().withN(Long.toString(tr.date1().getTime())));

        ExpectedAttributeValue date2 = new ExpectedAttributeValue()
                .withComparisonOperator(ComparisonOperator.LE)
                .withValue(new AttributeValue().withN(Long.toString(tr.date2().getTime())));

        ExpectedAttributeValue date3 = new ExpectedAttributeValue()
                .withComparisonOperator(ComparisonOperator.LE)
                .withValue(new AttributeValue().withN(Long.toString(tr.date3().getTime())));



        DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
        Map<String, ExpectedAttributeValue> expectedAtributes =
                ImmutableMap.<String, ExpectedAttributeValue>builder()
                        .put("date1", date1)
                        .put("date2", date2)
                        .put("date3", date3)
                        .build();

        saveExpression.setExpected(expectedAtributes);
        saveExpression.setConditionalOperator(ConditionalOperator.AND);

我不确定如何使用“保存表达式”捕获这两种方案。请注意我知道我可以动态传递一个单独的Save Expression,但这样做会涉及我的客户不想要的重大重构。

1 个答案:

答案 0 :(得分:1)

尝试对项目不存在的条件进行UpdateItem调用,并捕获ConditionalCheckFailedException。在catch块中,您知道该项存在,因此您可以执行UpdateItem调用,该调用对现有项目具有条件并满足上述条件。您无法使用Mapper设置attribute_exists conditions,因此您需要使用low-level APIDocument SDK来利用此功能。

try {
    table.updateItem(new UpdateItemSpec().withPrimaryKey(...)
        .withConditionExpression("attribute_not_exists(my_hash_key)")
        //one for each attribute of the item you are creating
        .withAttributeUpdate(new AttributeUpdate("attribute_name")
                                            .put("attribute_value")) 
    );
} catch(ConditionalCheckFailedException e) {
    table.updateItem(new UpdateItemSpec().withPrimaryKey(...)
        .withConditionExpression("attribute_exists(my_hash_key)")
        .withUpdateExpression("SET attributeToChange = :val")
        .withExpressionAttributeValues(ImmutableMap.of(":val", "asdf")) 
    );
}