栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在mongodb中实现分页

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在mongodb中实现分页

您正在谈论的概念可以称为“转发分页”。这有一个很好的理由,与使用

.skip()
.limit()
修饰符不同,它不能用于“返回”上一页或实际上“跳”至特定页面。至少不需要花费很多精力来存储“可见的”或“发现的”页面,因此,如果您想要的是“链接到页面”页面的类型,那么尽管性能出色,还是最好还是坚持使用
.skip()
and
.limit()
方法。缺点。

如果只“前进”是可行的选择,那么这里是基本概念:

db.junk.find().limit(3){ "_id" : ObjectId("54c03f0c2f63310180151877"), "a" : 1, "b" : 1 }{ "_id" : ObjectId("54c03f0c2f63310180151878"), "a" : 4, "b" : 4 }{ "_id" : ObjectId("54c03f0c2f63310180151879"), "a" : 10, "b" : 10 }

当然,这是您的首页,最多3个项目。现在考虑使用代码迭代游标:

var lastSeen = null;var cursor = db.junk.find().limit(3);while (cursor.hasNext()) {   var doc = cursor.next();   printjson(doc);   if (!cursor.hasNext())     lastSeen = doc._id;}

这样就可以迭代游标并执行某些操作,并且当确实达到游标中的最后一项时,可以将

lastSeen
值存储到present
_id

ObjectId("54c03f0c2f63310180151879")

在随后的迭代中,您只需将

_id
保留的值(在会话中或任何其他状态)提供给查询:

var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);while (cursor.hasNext()) {   var doc = cursor.next();   printjson(doc);   if (!cursor.hasNext())     lastSeen = doc._id;}{ "_id" : ObjectId("54c03f0c2f6331018015187a"), "a" : 1, "b" : 1 }{ "_id" : ObjectId("54c03f0c2f6331018015187b"), "a" : 6, "b" : 6 }{ "_id" : ObjectId("54c03f0c2f6331018015187c"), "a" : 7, "b" : 7 }

并且该过程一遍又一遍地重复,直到无法获得更多结果为止。

这是自然顺序(例如)的基本过程

_id
。对于其他事情,它变得更加复杂。考虑以下:

{ "_id": 4, "rank": 3 }{ "_id": 8, "rank": 3 }{ "_id": 1, "rank": 3 }    { "_id": 3, "rank": 2 }

要将其分成按等级排序的两页,那么您实质上需要知道的是您已经“看到”的内容,并排除这些结果。因此,请看第一页:

var lastSeen = null;var seenIds = [];var cursor = db.junk.find().sort({ "rank": -1 }).limit(2);while (cursor.hasNext()) {   var doc = cursor.next();   printjson(doc);   if ( lastSeen != null && doc.rank != lastSeen )       seenIds = [];   seenIds.push(doc._id);   if (!cursor.hasNext() || lastSeen == null)     lastSeen = doc.rank;}{ "_id": 4, "rank": 3 }{ "_id": 8, "rank": 3 }

在下一次迭代中,您希望小于或等于lastSeen的“等级”得分,但也要排除那些已经看到的文档。您可以通过

$nin


运算符执行此操作:

var cursor = db.junk.find(    { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen }).sort({ "rank": -1 }).limit(2);while (cursor.hasNext()) {   var doc = cursor.next();   printjson(doc);   if ( lastSeen != null && doc.rank != lastSeen )       seenIds = [];   seenIds.push(doc._id);   if (!cursor.hasNext() || lastSeen == null)     lastSeen = doc.rank;}{ "_id": 1, "rank": 3 }    { "_id": 3, "rank": 2 }

您实际持有多少“
seenIds”取决于您的结果在多大程度上可以改变该值。在这种情况下,您可以检查当前的“等级”分数是否不等于该

lastSeen
值,并丢弃当前
seenIds
内容,以使它不会增长太多。

这是“转发分页”的基本概念,供您练习和学习。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/442187.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号