仅当新属性大于现有属性

时间:2016-10-21 22:29:01

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

我想仅在新项目的日期比现有项目更新时才更新DynamoDB中的项目。目前,我正在查询现有项目,在我的代码中进行比较,然后写入db。我想知道是否有办法让DynamoDB为我做检查。我已经研究过使用Expected,但是它的比较运算符需要接受一个参数,这会破坏目的,因为它意味着无论如何都要查询现有项目。

我正在使用Java 8。

1 个答案:

答案 0 :(得分:6)

ConditionExpression 可用于检查条件并在条件满足时更新项目。这类似于SQL语句中的WHERE条件。不同之处是: -

1)DynamoDB需要分区键和Range键来更新项目。非关键属性条件可以在ConditionExpression

中给出

2)DynamoDB一次只能更新一个项目。

  

ConditionExpression - (String)必须满足的条件   命令条件更新成功。

     

预期 - (地图)这是遗留参数,用于向后   兼容性。新应用程序应使用ConditionExpression   代替。不要将遗留参数和表达式参数组合在一起   单个API调用;否则,DynamoDB将返回一个   ValidationException异常。

示例代码: -

以下代码仅在现有值" createdate" attribute小于新值(即换句话说,new值大于表中的现有值)。

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("yearkey", yearKey, "title", title)
        .withReturnValues(ReturnValue.UPDATED_NEW).withUpdateExpression("set #createdate = :val1")
        .withNameMap(new NameMap().with("#createdate", "createdate"))
        .withValueMap(new ValueMap().withString(":val1", createDate))
        .withConditionExpression("createdate < :val1");

UpdateItemOutcome outcome = null;
try {
    outcome = table.updateItem(updateItemSpec); 
} catch (ConditionalCheckFailedException ce) {
    System.out.println("Conditional check failed." + ce.getMessage());
    return false;
}

return true;