如何在mongodb中高效分页[重复]

Posted

技术标签:

【中文标题】如何在mongodb中高效分页[重复]【英文标题】:how to efficient paging in mongodb [duplicate] 【发布时间】:2016-11-22 22:23:51 【问题描述】:

我想按字段x 对所有文档进行排序(多个文档可以在此字段上具有相同的值)。然后每次我按“下一步”时,它都会加载另外 10 个文档。

如果多个文档具有相同的值,则可以在其中任意顺序显示,没关系。

由于skip() 在大型数据集上效率低下,如何有效地做到这一点?不需要分页数,只需要无限滚动。

【问题讨论】:

【参考方案1】:

如果您不需要分页数,那么您可以只使用单调递增的唯一 id 值;例如_id 和ObjectId()。

使用您的示例:

/* Value of first scroll record, and to be updated every iteration */
var current_id;

var scroll_size = 10; 

db.collection.find(_id: $lt: current_id).
                    limit(scroll_size).
                    sort(
                           _id: -1, 
                             x: 1   // Depending on your use case
                    );

上面的示例将为您提供最近的记录。根据您的用例,您必须决定如何处理新插入的文档。

如果您使用与_id 不同的字段来滚动浏览,请确保在该字段上添加适当的indexes。

【讨论】:

但这并没有给出按 x 排序的记录,对吧?这是按_id排序的 如您在sort() 的示例中所见,结果同时按_idx 排序。您也可以尝试 A)在匹配部分中包含 x 以及 _id 或 B)仅在匹配部分中使用“x”。 'x' 的值是多少? @WanBachtiar 是的,它按x 排序,但如果按x 排序更改了顺序,这将不再正常工作,因为您的_id: $lt: current_id 不再有意义。

以上是关于如何在mongodb中高效分页[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 中高效/快速地执行数组连接,类似于 MongoDB $lookup?

如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?

如何使用 MongoDB ObjectId 作为上一个和下一个按钮的键进行分页?

spring data mongodb Query 及分页

如何使用MongoDB聚合进行分页?

如何使用 Spring Boot 在 Mongodb 中保存重复项?