DynamoDB 条件表达式查询

问题描述 投票:0回答:1

用例

我有一个表,其架构如下:

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();

不起作用。

有什么建议吗?

java amazon-dynamodb dynamodb-queries
1个回答
0
投票

您的问题是因为当您对属性设置条件时,DynamoDB 不会评估整个数据库,它仅评估您正在操作的项目。所以这种情况发生在完全不同的物品上。

您将需要利用交易来确保本博客文章中定义的全局唯一性:

https://aws.amazon.com/blogs/database/simulated-amazon-dynamodb-unique-constraints-using-transactions/

© www.soinside.com 2019 - 2024. All rights reserved.