据说使用skip()在具有许多记录的MongoDB集合中进行分页很慢,不推荐使用.
可以使用远程分页(基于> _id比较)
db.items.find({_id: {$gt: ObjectId('4f4a3ba2751e88780b000000')}});
Run Code Online (Sandbox Code Playgroud)
它很适合显示上一页.&下一个按钮 - 但是当你想要显示实际页码1 ... 5 6 7 ... 124时,它实现起来并不容易 - 你需要预先计算每页开始的"_id".
所以我有两个问题:
1)我应该什么时候开始担心?什么"记录太多"而跳过()的速度明显减慢?1 000?1 000 000?
2)使用远程分页时,显示与实际页码的链接的最佳方法是什么?
我可能会遗漏一些东西,因为我还在学习MongoDB的细节,但我需要帮助分页集合.
我有一个有名单的集合.
底部牛肉
鸡胸肉6oz鸡胸肉
8oz
鸡胸肉8oz
鸡胸肉8oz
鸡胸肉随机
鸡腿
鸡里脊
肉鸡大腿
犹太盐
我在"ProductName,_id"上创建了一个复合索引.
我运行这个查询:
db.ProductGuideItem.find( { ProductName: { $gt: "Chicken Breast 8oz" } } ).sort({ProductName:1,_id:1}).limit(3);
Run Code Online (Sandbox Code Playgroud)
请注意,有3个"鸡胸肉8oz"项目.
如果我运行该查询,我得到...
鸡胸肉随机
鸡腿
鸡里脊肉
如果我正在分页并从顶部开始.该查询将错过其他2"鸡胸肉8oz".
因此,如果每个页面只能有3个项目,我想看到第2页,那么我应该看到..
鸡胸肉8oz
鸡胸肉8oz
鸡胸肉随机.
但我不是.这将是最后一个鸡胸肉8盎司,并从那里开始.
有没有解决的办法?
如果列表以相反的方式排序,我该怎么做呢?
当您基于单个唯一字段进行分页时,范围分页是简单的,但是在具有非唯一字段(可能一次有多个字段)的情况下,它是如何工作的(如果有的话)?
TL;DR:使用基于范围的分页对“高级搜索”类型查询进行分页和排序是否合理或可能?这意味着对用户选择的(可能是非唯一的)字段进行查询和排序。
例如,假设我想对文字游戏中玩过的文字文档的搜索进行分页。假设每个文档都有 ascore和 a word,我想让用户对这些字段进行过滤和排序。这两个领域都不是独一无二的。假设相关字段有一个排序索引。
从简单开始,假设用户想要查看所有得分为 10 的单词:
// page 1
db.words.find({score: 10}).limit(pp)
// page 2, all words with the score, ranged on a unique _id, easy enough!
db.words.find({score: 10, _id: {$gt: last_id}}).limit(pp)
Run Code Online (Sandbox Code Playgroud)
但如果用户想要获取所有得分低于 10 的单词怎么办?
// page 1
db.words.find({score: {$lt: 10}}).limit(pp)
// page 2, getting ugly...
db.words.find({
// OR because we need everything lt the last score, but also docs with
// the *same* score as the last score we haven't seen yet …Run Code Online (Sandbox Code Playgroud)