仅当新属性大于现有属性时,DynamoDb才会更新项目

ale*_*lov 4 java amazon-web-services amazon-dynamodb

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

我正在使用Java 8.

not*_*est 7

ConditionExpression可用于检查条件,如果满足条件,更新的项目.这类似于SQL语句中的WHERE条件.不同之处是: -

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

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

ConditionExpression - (字符串)条件更新成功必须满足的条件.

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

示例代码: -

仅当现有值"createdate"属性小于新值时(即换句话说,新值大于表中的现有值),以下代码才更新项目.

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;
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了!我一直在寻找像“SET best = max(best, #value)”这样的更新表达式,但它不存在(据我所知)。使用 ConditionExpression 可以达到预期目标。 (2认同)