DynamoDB中的正向和反向分页

12
我正在使用DynamoDB和NodeJS在UI上列出一些对象。列表很长,由于DynamoDB一次最多只能扫描/查询1MB的数据,因此我决定使用分页,因此在前端我有“上一页”和“下一页”按钮,用于从当前页面向前或向后进行分页。
我的问题是,我想通过使用选择的DynamoDB索引基于“DynamoDB Query”功能从“表X”中一次检索20个项目。假设我刚刚获取了最初的20个结果(0-20),因此在单击下一个按钮时,我希望获取结果:21-40等。另外,我希望启用向后分页,因此当我在显示结果为41-60的页面上时,“返回”按钮将再次获取结果:21-40。
据我所知,DynamoDB不支持数字偏移量。
如何实现向前和向后的分页? 我在DynamoDB中是新手,请帮帮我。

对于新手来说,与dynamodb一起使用的最佳分页策略是 - 键集分页。简而言之,从第1页跳转到第50页很困难。您必须按顺序向前移动 - 例如网站中的惰性加载。 - Nidhin David
3个回答

27

DynamoDB只支持从前往后的数据分页,对于后退分页,需要在前端中处理。

对于大型Tables(超过1MB大小),DynamoDB会:

  1. 扫描或查询最多1MB的数据。
  2. 返回LastEvaluatedKey以获取下一组数据或下一页。该值用作分页键前端中进行向前和向后分页。

LastEvaluatedKey保存了从ScanQuery期间从DynamoDB提取的最后一个对象的值。

你需要在后端中执行以下操作:

  1. 使用DynamoDB QueryLIMIT属性,指定您只需要20个项目。
  2. 使用DynamoDB QueryExclusiveStartKey属性指定下一组数据将从该属性的指定值开始。

你需要在前端中执行以下操作:

  1. 保持一个对象数组arr [],用于承载Pagination Keys。

  2. 保持一个变量page初始化为-1,其值将指示用户当前所在的页面。

  • 加载列表的初始页面到UI中。如果有LastEvaluatedKey,则将其推入arr并增加page
  • 现在,您只有一页内容,page表示您在第0页arr包含下一页的页面键

    1. Next按钮的代码应遵循以下逻辑:

      请求服务器使用ExclusiveStartKey = arr[page]获取下一页

    2. 当下一页的结果到达时,您将再次拥有另一个LastEvaluatedKey,因此再次将其推入arr并增加page。 所以你应该明白我们如何保存页面键了。

    3. Back按钮的代码应遵循以下逻辑:

      由于page变量表示当前页,因此page-1表示上一页。所以:
      if (page-1>=0) 请求服务器使用ExclusiveStartKey = arr[page - 1]

    每当获取一页后,您需要使用arr[]page变量来管理何时可以单击BackNext按钮。


    如何处理用户在未点击“下一页”的情况下点击任意页面?例如,我有10页,用户在第2页时直接点击了第8页,没有点击“下一页”,该如何处理? - huykon225

    2
    DynamoDB中的分页功能依赖于LastEvaluatedKey。您应该能够使用它来实现您想要的内容,并使用页面大小始终为20个项目。它只是不会是数值偏移量。

    好的,明白了。但是如何进行后退导航? - infinityskyline
    还有ExclusiveStartKey,如果使用索引,则有ScanIndexForward - Yusuf

    2

    在DynamoDB中不能使用页面编号,但对于Query(仅限Query),您可以使用--scan-index-forward选项向后移动。

    指定索引遍历的顺序:如果为true(默认值),则正向遍历;如果为false,则反向遍历。

    AWS DynamoDB CLI查询

    因此,您可以使用LastEvaluatedKey进行向前分页,并使用数据中的第一个键以及scan-index-forward选项进行向后分页。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接