php – 计算已排序分页的给定记录的跳过值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 计算已排序分页的给定记录的跳过值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2394字,纯文字阅读大概需要4分钟。
内容图文
![php – 计算已排序分页的给定记录的跳过值](/upload/InfoBanner/zyjiaocheng/714/f7d8f14c982c4ef8ace964ad812cac4f.jpg)
我正在尝试使用php驱动程序计算mongo db集合中给定记录的跳过值.因此,获取给定记录,找出整个集合中该记录的索引.这可能吗?
目前我正在选择所有记录并手动对结果数组进行索引.
解决方法:
这称为“前向分页”,这是一种概念,可用于在使用“已排序”结果时以“向前”方向“有效地页面”结果.
包含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
});
这样做是“排除”从结果列表中记录在lastSeen中的_id的所有值,并确保所有结果需要“小于或等于”(降序)为排序记录的lastVal字段“a”.
这将产生集合中的下两个结果:
{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },
但处理完我们的价值后,现在看起来像这样:
lastVal = 2,
lastSeen = [4];
所以现在的逻辑是,您不需要排除之前看到的其他_id值,因为您只是真正寻找“a”的值而不是“小于或等于”lastVal,因为只有“one”在该值处看到的_id值仅排除该值.
这当然会产生下一页使用与上面相同的代码:
{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }
这是通过结果“转发页面”的最有效方式,对于“排序”结果的有效分页特别有用.
但是,如果您想在任何阶段“跳转”到第20页或类似的操作,那么这不适合您.您仍然坚持使用传统的.skip()和.limit()方法来实现“页码”,因为没有其他合理的方法来“计算”这个.
所以这一切都取决于您的应用程序如何实现“分页”以及您可以使用的内容. .skip()和.limit()方法会受到“跳过”的影响,可以通过此处的方法来避免.
另一方面,如果你想“跳转到页面”,那么“跳过”是你唯一真正的选择,除非你想建立一个结果的“缓存”.但这完全是另一个问题.
内容总结
以上是互联网集市为您收集整理的php – 计算已排序分页的给定记录的跳过值全部内容,希望文章能够帮你解决php – 计算已排序分页的给定记录的跳过值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。