首页 > 解决方案 > 使用java在mongodb上分页的最佳方法是什么

问题描述

我正在尝试通过以下代码在 mongodb 中创建一个简单的分页。

collection.find().skip(n).limit(n);

但是如果我们看到在java术语中首先find会返回所有记录认为我有200万条记录,那么它看起来不会出现性能问题,然后它将它传递给skip方法,然后它将传递给limit方法. 这意味着每次此查询将获取所有数据库记录或 mongodb 驱动程序的工作方式不同,我错过了什么?

标签: javamongodb

解决方案


当谈到 MongoDB 中的分页时,很容易编写以下代码:

collection.find().skip(pageSize*(pageNum-1)).limit(pageSize);

以上是 MongoDB 支持的原生解决方案,但是如果集合中有大量文档,则效率不高。假设您有 100M 个文档,并且您想从中间偏移量(50Mth)获取数据。MongoDB 必须建立完整的数据集并从头走到指定的偏移量,这将是低性能。随着偏移量的增加,性能会不断下降。

根本原因是skip()命令效率不高,不能从索引中获得大的好处。


以下是提高大数据分页性能的另一种解决方案:

分页的典型使用场景是有一个表格或列表来显示指定页面的数据,还有一个“上一页”“下一页”按钮来加载上一页或下一页的数据。

如果您获得了'_id'当前页面中最后一个文档的 ,您可以使用find()代替skip()。使用_id > currentPage_LastDocument._id作为查找下一页数据的条件之一。这是伪代码:

//Page 1
collection.find().limit(pageSize);
//Get the _id of the last document in this page
last_id = ...

//Page 2
users = collection.find({'_id': {$gt: last_id}}).limit(pageSize);
//Update the last id with the _id of the last document in this page
last_id = ...

这将避免 MongoDB 在使用skip().


推荐阅读