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

计算给定记录的跳过值以进行分页

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

计算给定记录的跳过值以进行分页

这称为“转发分页”,这是一个概念,当您使用“排序的”结果时,可以沿“转发”方向对结果进行“有效分页”。

包含Javascript逻辑(因为它可以在Shell中使用),但翻译起来并不难。

一般的概念:

{ "_id": 1, "a": 3 },{ "_id": 2, "a": 3 },{ "_id": 3, "a": 3 },{ "_id": 4, "a": 2 },{ "_id": 5, "a": 1 },{ "_id": 6, "a": 0 }

以那些“已经排序”的文档(为方便起见)为例,我们希望按每页“两个”项目“分页”。

首先,您需要执行以下操作:

var lastVal = null,    lastSeen = [];db.collection.find().sort({ "a": -1 }).limit(2).forEach(function(doc) {    if ( lastVal != doc.a ) {        lastSeen = [];    }    lastVal = doc.a;    lastSeen.push( doc._id );    // do something useful with each document matched});

现在,这些

lastVal
lastSeen
存储在诸如“会话变量”之类的东西中,然后就Web应用程序而言,可以在下一个请求中访问这些东西,否则就不会存储类似的东西。

它们应该包含的是您正在排序的最后一个值,以及

_id
由于该值未更改而出现的“唯一” 值列表。因此:

lastVal = 3,lastSeen = [1,2];

关键是,当对“下一页”的请求到来时,您希望将这些变量用于类似这样的操作:

var lastVal = 3,    lastSeen = [1,2];db.collection.find({     "_id": { "$nin": lastSeen },     "a": { "$lte": lastVal }}).sort({ "a": -1 }).limit(2).forEach(function(doc) {    if ( lastVal != doc.a ) {        lastSeen = [];    }    lastVal = doc.a;    lastSeen.push( doc._id );    // do something useful with each document matched});

这样做是从结果列表中“排除”

_id
记录在其中的所有值,
lastSeen
并确保所有结果都必须“小于或等于”(降序)
lastVal
记录在排序字段“
a”中”。

这将产生集合中的下两个结果:

{ "_id": 3, "a": 3 },{ "_id": 4, "a": 2 },

但是在处理完我们的值后,现在看起来像这样:

lastVal = 2,lastSeen = [4];

因此,现在的逻辑是,您不需要排除

_id
之前看到的其他值,因为您只在真正寻找“ a”的值而不是“小于或等于”
the的值,
lastVal
并且因为只
_id
看到了“一个” 值在那个值,然后只排除那个。

当然,这将使用与上面相同的代码产生下一页:

{ "_id": 5, "a": 1 },{ "_id": 6, "a": 0 }

通常,这是通过结果“转发页面”的最有效方式,对于“分页”结果的有效分页特别有用。

但是,如果您想

20
在任何阶段“跳转”到页面或类似的操作,则不适合您。你被卡住的传统
.skip()
.limit()
方法能够通过“页码”要做到这一点,因为那里是“计算”没有其他合理的方式。

因此,这完全取决于您的应用程序如何实现“分页”以及您可以使用什么。在

.skip()
.limit()
做法受到“退出”,可以通过在这里使用的方式来避免的性能。

另一方面,如果要“跳转到页面”,那么除非要建立结果的“缓存”,否则“跳过”是唯一的选择。但这完全是另一个问题。



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

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

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