如果我们设置限制,如何获取 DynamoDB 中的总页数?

How to get total number of pages in DynamoDB if we set a limit?

我有一个存储在 DynamoDB 中的文档列表。数据库中存储了超过 10,000 个文档。我在请求时将限制设置为100DynamoDB 通过 return 向我提供第一个 100 个文档和 LastEvaluatedKey 来获取下一个 100个文档。

这里的问题是我还想要 DynamoDB 到 return 我的总页数用于分页目的。在这种情况下,因为我有 10,000 个文档,所以它应该 return 100(分页数)

现在我所做的是,我一直在通过循环查询手动计数,直到 return 我 LastEvaluatedKey。将已完成的循环次数相加以获得总页数。但我相信有更好的方法。

Scan”(读取整个 table)和“Query”(读取具有相同分区键的所有项目)操作都没有 return估计有多少总结果。在某些情况下(例如,当提供 FilterExpression 时),DynamoDB 没有有效的方法来进行此估计。在其他情况下,DynamoDB 可能有办法提供此信息,但事实并非如此。

如果我没理解错的话,您想要 Scan 整个 table,不带过滤器。就像我说的,Scan 本身并没有给你 table 中的项目数。但是你可以使用 DescribeTable 找到这个数字,其中 returns,除其他外,一个“ItemCount”属性,它是对 [=26] 中项目总数的估计=],这可能不完全 up-to-date 但也许足以满足您的需求(如果您想要对某种进度报告进行估算,则不需要 100% 准确)。

如果您确实需要准确 up-to-the-moment 分区或整个 table 中的项目计数,您始终可以尝试将此类计数器维护为单独的数据。正确地做到这一点并非微不足道,并且会对性能产生影响,但在某些用例中(例如,很少写入和大量读取)可能很有用。

正如其他答案所正确解释的那样,没有有效的方法来获取 DynamoDB 查询或扫描操作的总结果数。因此,没有有效的方法来获取总页数。

但是,我想指出的是,现代 UI 已经从经典分页转向无限滚动设计模式。当列表滚动时,结果的“下一页”按需加载。这可以通过 DynamoDB 实现。您仍然可以显示离散的页面,但不能先验地显示有多少结果或有多少页。这是 DynamoDB 当前的缺点。

您可以使用 DynamoDB 流维护您自己的计数 - 基本上您创建一个 Lambda 函数来监视项目 created/deleted,然后写回 DynamoDB 中存储当前项目计数的计数器项目。