使用java在mongodb上进行分页的最佳方法是什么?

时间:2018-05-09 19:03:11

标签: java mongodb

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

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

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

1 个答案:

答案 0 :(得分:7)

在谈论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 = ...

这将避免使用skip()时mongodb遍历大数据。