使用游标的MongoDB分页而不进行排序

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

[在互联网上寻找分页技术时,通常会发现两种方法:

  • 基于偏移量的分页:
Collection.find(
  { where_this: "equals that" },
  { skip: 15, limit: 5 }
) 
  • 基于游标的分页:
Collection.find(
  { where_this: "equals that", _id: { $gt: cursor }},
  { sort: { _id: 1 }}
) 

但是有一种方法可以进行基于游标的分页,而无需根据该游标对集合进行排序?就像,告诉Mongo:“好吧,我想要_id之后的5个下一项,无论_id的顺序如何,只要看到_id后再给我5个项目即可。”遵循这些原则:

Collection.find(
  { where_this: "equals that", _id: { $must_come_after: cursor }},
  { sort: { other_field: 1 }}
) 

并非总是可以将要排序的字段用作光标。首先,因为这些字段可以是不同的类型,并且您可以允许应用程序用户根据需要对表格进行排序。使用像GraphQL这样的强类型API框架,这将很麻烦。其次,在排序的集合中,该字段可以具有两个或更多个相等的值,并且彼此跟随。如果您的页面在中间分开,则询问下一页将为您提供重复项或忽略项目。

有没有办法做到这一点?通常如何做以允许自定义排序字段without基于偏移量的分页?谢谢。

mongodb mongoose mongoid monk
1个回答
0
投票

[当我们谈论“对结果集进行分页”时,隐含的假设是结果集在整个过程中保持不变。为了使结果集保持不变,通常必须对其进行排序。在不指定顺序的情况下,数据库可以自由地以任何顺序返回文档,并且该顺序可以从一次检索更改为下一次检索。重新排序用户正在翻阅的文档会造成不良的用户体验。

在排序的集合中,该字段可以具有两个或更多个相等的值,并且彼此跟随。如果您的页面在中间分开,则询问下一页将为您提供重复项或忽略项目。

数据库可以按任何顺序返回比较相等的文档,并且该顺序可以在相邻查询之间改变。这就是为什么在具有低基数的字段上进行排序时,最好将另一个具有高基数的字段添加到排序表达式中,以确保文档以稳定的顺序返回。

但是有一种方法可以进行基于游标的分页,而无需根据该游标对集合进行排序?

您可以在游标标识符中编码偏移量并使用跳过/限制。

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