【问题标题】:DynamoDb update item only if new attribute is greater than existing one仅当新属性大于现有属性时,DynamoDb 才更新项目
【发布时间】:2016-10-21 22:29:01
【问题描述】:

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

我正在使用 Java 8。

【问题讨论】:

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


    【解决方案1】:

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

    1) DynamoDB 需要 Partition key 和 Range key 来更新项目。非关键属性条件可以在ConditionExpression中给出

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

    ConditionExpression —(字符串)必须满足的条件 命令条件更新成功。

    Expected — (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;
    

    【讨论】:

    • 啊,谢谢!我无法让代码失败无效日期,但事实证明问题是我以错误的格式传递了日期。作为记录,我将new DateTime(createDate).toString() 传递给了值映射。
    • 字段名前不是.withConditionExpression("createdate &lt; :val1");应该有#吗?例如。 .withConditionExpression("#createdate &lt; :val1"); ?
    • 这太棒了!我正在寻找像SET best = max(best, #value) 这样的更新表达式,它不存在(afaik)。使用 ConditionExpression 可以实现预期目标。
    • @DimitryK 我认为这就是NameMap 在这里所做的。将其重命名为createdate
    猜你喜欢
    • 2020-05-21
    • 2018-09-24
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多