首页 > 解决方案 > 对 DynamoDB 表中不存在的项目应用条件比较 (lt, eq, gt) 表达式

问题描述

我的目标是在 DynamoDB 表中插入一个项目,如果它不存在并且其中一个属性具有最小值。

hash-key 是productId,而 rage-key 是locationId。如果 应该具有最小值的属性price。最小值为0.0

例如

我尝试使用的代码是:

PrimaryKey primaryKey = new PrimaryKey(
    "productId", productId,
    "locationId", locationId
);
Item newItem = new Item()
    .withPrimaryKey(primaryKey)
    .withDouble("price", 0.0d);
PutItemSpec putItemSpec = new PutItemSpec()
    .withItem(newItem)
    .withConditionExpression("attribute_not_exists(productId) AND attribute_not_exists(locationId) AND (price > :lowerBound)")
    .withValueMap(new ValueMap().withNumber(":lowerBound", 0.0d));
PutItemOutcome putItemOutcome = table.putItem(putItemSpec);

当我运行它时,我得到ConditionalCheckFailedException. 为了隔离问题,我尝试将条件分解为

我发现它attribute_not_exists(productId) AND attribute_not_exists(locationId)本身可以正常工作。

price > :lowerBound单独使用时失败。我尝试了像0.0,18000.0甚至-2.0. 他们都失败了,因为ConditionalCheckFailedException

我想知道我对条件表达式的理解是否不正确?甚至可以将比较表达式应用于尚不存在的项目吗?

欢迎任何建议。

标签: amazon-dynamodb

解决方案


DynamoDB 中的条件表达式在写入之前描述了 DynamoDB 中的预期项目。无需使用条件表达式来描述您正在编写的值的期望值,因为您可以在编写之前自己验证这些期望值。


推荐阅读