我有一个表,其架构如下:
UserId(hashkey), earnedPoints, status
我想实现: 在任何给定时间,对于同一个卖家,他/她应该只有 1 个 PENDING 状态记录。示例:
user1, 10, PENDING
-> 成功,因为数据库没有 user1 的记录user1, 30, PENDING
-> 条件失败,因为数据库已经包含 user1 记录并且该记录处于 PENDING 状态。user2, 10, REDEEMED
-> 成功,因为数据库没有 user2 的记录user2, 10, PENDING
-> 成功,db 有 user2 的记录,但该记录处于 REDEEMED 状态,因此允许插入 PENDING 记录。尝试使用 DDB 表达式:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html 在
putItem
操作期间使用 software.amazon.awssdk.enhanced
客户端实现此目的。
所以我写道:
Expression conditionExpression = Expression.builder()
.expression("attribute_not_exists(userId) OR #currentStatus <> :pendingStatus")
.putExpressionName("#currentStatus", "status")
.putExpressionValue(":pendingStatus",
AttributeValue.builder()
.s("PENDING")
.build())
.build();
不起作用。
有什么建议吗?
您的问题是因为当您对属性设置条件时,DynamoDB 不会评估整个数据库,它仅评估您正在操作的项目。所以这种情况发生在完全不同的物品上。
您将需要利用交易来确保本博客文章中定义的全局唯一性: