Gar*_*bit 1 php mongodb mongodb-php mongodb-query
我正在尝试使用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 }
Run Code Online (Sandbox Code Playgroud)
以那些“已经排序”的文档(为方便起见)为例,我们希望按每页“两个”项目“分页”。
首先,您需要执行以下操作:
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
});
Run Code Online (Sandbox Code Playgroud)
现在,这些lastVal和lastSeen您存储在诸如“会话变量”之类的东西中,就Web应用程序而言,可以在下一个请求中访问这些东西,否则就不会存储类似的东西。
它们应该包含的是您正在排序的最后一个值,以及_id由于该值未更改而出现的“唯一” 值列表。因此:
lastVal = 3,
lastSeen = [1,2];
Run Code Online (Sandbox Code Playgroud)
关键是,当对“下一页”的请求到来时,您希望将这些变量用于类似这样的操作:
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
});
Run Code Online (Sandbox Code Playgroud)
这样做是从结果列表中“排除” _id记录在其中的所有值,lastSeen并确保所有结果都必须“小于或等于”(降序)lastVal记录在排序字段“ a”中”。
这将产生集合中的下两个结果:
{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },
Run Code Online (Sandbox Code Playgroud)
但是在处理完我们的值后,现在看起来像这样:
lastVal = 2,
lastSeen = [4];
Run Code Online (Sandbox Code Playgroud)
因此,现在的逻辑是,您不需要排除_id之前看到的其他值,因为您只在真正寻找“ a”的值而不是“小于或等于” the的值,lastVal并且因为只_id看到了“一个” 值在那个值,然后只排除那个。
当然,这将使用与上面相同的代码产生下一页:
{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }
Run Code Online (Sandbox Code Playgroud)
通常,这是通过结果“转发页面”的最有效方式,对于“分页”结果的有效分页特别有用。
但是,如果您想20在任何阶段“跳转”到页面或类似操作,则不适合您。你被卡住的传统.skip()和.limit()方法能够通过“页码”要做到这一点,因为那里是“计算”没有其他合理的方式。
因此,这完全取决于您的应用程序如何实现“分页”以及您可以使用什么。在.skip()和.limit()做法受到“退出”,可以通过在这里使用的方式来避免的性能。
另一方面,如果您想“跳转到页面”,那么除非要构建结果的“缓存”,否则“跳过”是您唯一的选择。但这完全是另一个问题。
| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |