我正在尝试使用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,但这样做会涉及我的客户不想要的重大重构。
答案 0 :(得分:1)
尝试对项目不存在的条件进行UpdateItem调用,并捕获ConditionalCheckFailedException。在catch块中,您知道该项存在,因此您可以执行UpdateItem调用,该调用对现有项目具有条件并满足上述条件。您无法使用Mapper设置attribute_exists
conditions,因此您需要使用low-level API或Document 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"))
);
}