据说在记录多的MongoDB集合中使用skip()进行分页速度很慢,不推荐。
可以使用范围分页(基于 >_id 比较)
db.items.find({_id: {$gt: ObjectId('4f4a3ba2751e88780b000000')}});
它适合显示上一个。 & 下一个按钮 - 但当您想要显示实际页码 1 ... 5 6 7 ... 124 时,实现起来并不容易 - 您需要预先计算每个页面从哪个“_id”开始。
所以我有两个问题:
1)我什么时候应该开始担心这个问题?当“记录太多”且skip() 速度明显减慢时? 1 000? 1 000 000?
2)使用范围分页时显示带有实际页码的链接的最佳方法是什么?
好问题!
“多少才算太多?” - 当然,这取决于您的数据大小和性能要求。就我个人而言,当我跳过超过 500-1000 条记录时,我会感到不舒服。
实际答案取决于您的要求。这就是现代网站的做法(或者至少是其中的一些网站)。
首先,导航栏如下所示:
1 2 3 ... 457
他们从总记录数和页面大小中获取最终页码。让我们跳到第 3 页。这将涉及从第一条记录开始的一些跳过。当结果到达时,您知道第 3 页上第一条记录的 ID。
1 2 3 4 5 ... 457
让我们跳过一些内容并转到第 5 页。
1 ... 3 4 5 6 7 ... 457
你明白了。在每个点上,您都可以看到第一页、最后一页和当前页面,以及从当前页面向前和向后的两页。
Queries
var current_id; // id of first record on current page.
// go to page current+N
db.collection.find({_id: {$gte: current_id}}).
skip(N * page_size).
limit(page_size).
sort({_id: 1});
// go to page current-N
// note that due to the nature of skipping back,
// this query will get you records in reverse order
// (last records on the page being first in the resultset)
// You should reverse them in the app.
db.collection.find({_id: {$lt: current_id}}).
skip((N-1)*page_size).
limit(page_size).
sort({_id: -1});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)