【问题标题】:How to get total number of pages in DynamoDB if we set a limit?如果我们设置限制,如何获取 DynamoDB 中的总页数?
【发布时间】:2019-07-04 04:26:33
【问题描述】:

我有一个存储在 DynamoDB 中的文档列表。数据库中存储了超过 10,000 个文档。我在请求时将限制设置为 100DynamoDB 做得很好,将前 100 个文档和LastEvaluatedKey 返回给我以获取下一个 100 个文档。

这里的问题是我还希望 DynamoDB 向我返回总页数以进行分页。在这种情况下,因为我有 10,000 个文档,它应该返回 100(分页数)

现在我所做的是通过循环查询手动计数,直到它没有返回LastEvaluatedKey。加起来已经完成了多少次循环以获得总页数。但我相信有更好的方法。

【问题讨论】:

  • 您可以再编写一个查询来计算总行数,这有助于您在前端进行计算。 .

标签: javascript node.js amazon-dynamodb dynamodb-queries


【解决方案1】:

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

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

如果您确实需要对分区或整个表中的项目进行准确且最新的计数,您始终可以尝试将此类计数器作为单独的数据进行维护。正确执行此操作并非易事,并且会影响性​​能,但在某些用例中(例如,很少写入和大量读取)可能很有用。

【讨论】:

  • 但是,即使在附加表格的帮助下,我将如何获得,比如说,在通话中的第 5 页?页面大小也应该是可定制的。你能给我推荐一个流行的 NoSQL DB 可以做到这一点吗,因为我什至看到谷歌在他们的 NewsAPI 中使用这种分页。
【解决方案2】:

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

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

【讨论】:

  • 由于 DynamoDB 的行为与 MySql 不同,我得出结论以无限滚动的方式进行。无论如何感谢您的建议。
  • 但有时,让我们以聊天应用为例,当您想通过搜索某些内容进入中间帖子时,您不会一直进行所有抓取,而是抓取该中间页面,然后如果用户移动向上,获取上页,否则如果用户向下移动,则获取下页,这种情况怎么做?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2013-06-09
    相关资源
    最近更新 更多