我正试图通过下面的代码在mongodb中创建一个简单的分页。
collection.find().skip(n).limit(n);
但是,如果我们看到在java术语中首先查找将返回所有记录,认为我有200万条记录,那么看起来会出现性能问题,那么它会将它传递给skip方法然后它会被传递到限制方法。这意味着每次这个查询将获取所有数据库记录或mongodb驱动程序的工作方式不同,我错过了什么?
答案 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遍历大数据。