DynamoDB - 基于记录数的条件放置

DynamoDB - Conditional put based on number of records

我正在尝试在 DynamoDB 中实现一种乐观锁定,我根据给定分区键(table 使用复合键)存在的记录数插入一条新记录。

具体的上下文将是分类帐,其中分类帐中的每个文档代表存款或取款,并包含诸如 totalBalancepurchasedItem(如果存款则为空)、userId, createDate, 等等

这个想法是服务(异步)将在其工作流程开始时获取给定用户的分类帐条目数量以及他们的最新记录。它会在更新账本之前执行一些操作。我想要执行 TransactWrite 的最后一步,其中条件检查确保用户存在与开始时相同数量的分类帐条目。如果不是,则该过程重新开始。

我知道 DynamoDB 支持对单个记录的属性进行条件检查,但是是否可以编写一个条件检查来查看查询返回的记录数?

aws dynamodb query --table-name myLedger --key-condition-expression "userId = :u" --expression-attribute-values '{":u": {"S": "0123abcd"}}' --select "COUNT"

这是不可能的。

DynamoDB 仅在文档​​级别运行,并且不知道该分区键下存储了多少文档。如果不阅读所有文档,您将无法弄清楚,并且不能保证您甚至可以在一次操作中做到这一点,更不用说可以在条件表达式中使用的方式了。

您的每个条目一个文档的设计更适合关系数据库,在这里并不适用。在文档数据库中,您通常希望有一个包含多个条目的文档。

如果重构数据模型以将所有条目放在一个文档中,则通过更新表达式自动执行此更新变得微不足道。