amazon-dynamodb - 对 DynamoDB 表中不存在的项目应用条件比较 (lt, eq, gt) 表达式
问题描述
我的目标是在 DynamoDB 表中插入一个项目,如果它不存在并且其中一个属性具有最小值。
hash-key 是productId
,而 rage-key 是locationId
。如果 应该具有最小值的属性price
。最小值为0.0
。
例如
- 如果表中不存在的具有主键的项目具有
price
as10.0
,它将被插入。但如果该项目具有price
as0.0
,则应拒绝该项目。 - 如果该项目已经存在并且
price
是0.0
,我想将 更新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
我发现它attribute_not_exists(productId) AND attribute_not_exists(locationId)
本身可以正常工作。
price > :lowerBound
单独使用时失败。我尝试了像0.0
,18000.0
甚至-2.0
. 他们都失败了,因为ConditionalCheckFailedException
。
我想知道我对条件表达式的理解是否不正确?甚至可以将比较表达式应用于尚不存在的项目吗?
欢迎任何建议。
解决方案
DynamoDB 中的条件表达式在写入之前描述了 DynamoDB 中的预期项目。无需使用条件表达式来描述您正在编写的值的期望值,因为您可以在编写之前自己验证这些期望值。
推荐阅读
- html - 引导列类不遵循边距或容器流体类
- java - 控制器不使用 Feign 可分页排序
- c# - 结构中的只读字段
- excel - 在 Excel 用户窗体中的运行时创建和添加控件并将事件附加到它们
- sql - 将 varchar 转换为无毫秒的日期时间
- javascript - 如何获取进度条的div元素的点击位置
- python - 显示气泡频率或重量的 Python 气泡图(我没有 az 向量)?
- windows - 我应该使用哪种类型的证书对 Windows 桌面应用程序进行代码签名?
- c# - HTTP 错误 500.31 - 无法加载 ASP.NET Core 运行时
- python - Python列出文件/目录而不更新上次访问时间?