php分页排序不变化,php – 计算已排序分页的给定记录的跳过值
我正在嘗試使用php驅(qū)動程序計(jì)算mongo db集合中給定記錄的跳過值.因此,獲取給定記錄,找出整個(gè)集合中該記錄的索引.這可能嗎?
目前我正在選擇所有記錄并手動對結(jié)果數(shù)組進(jìn)行索引.
解決方法:
這稱為“前向分頁”,這是一種概念,可用于在使用“已排序”結(jié)果時(shí)以“向前”方向“有效地頁面”結(jié)果.
包含JavaScript邏輯(因?yàn)樗趕hell中工作),但不難翻譯.
概念一般:
{ "_id": 1, "a": 3 },
{ "_id": 2, "a": 3 },
{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },
{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }
考慮那些“已經(jīng)排序”的文檔(為方便起見)作為我們希望每頁“兩個(gè)”項(xiàng)目“頁面”的結(jié)果示例.
在第一個(gè)例子中,你做這樣的事情:
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
});
現(xiàn)在那些lastVal和lastSeen是存儲在類似“會話變量”之類的東西,而不是在Web應(yīng)用程序的下一個(gè)請求中可以訪問,或者其他類似的東西.
它們應(yīng)該包含的內(nèi)容是您排序的最后一個(gè)值以及自該值未發(fā)生變化后看到的“唯一”_id值列表.因此:
lastVal = 3,
lastSeen = [1,2];
關(guān)鍵是當(dāng)“下一頁”的請求出現(xiàn)時(shí),你想要將這些變量用于這樣的事情:
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
});
這樣做是“排除”從結(jié)果列表中記錄在lastSeen中的_id的所有值,并確保所有結(jié)果需要“小于或等于”(降序)為排序記錄的lastVal字段“a”.
這將產(chǎn)生集合中的下兩個(gè)結(jié)果:
{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },
但處理完我們的價(jià)值后,現(xiàn)在看起來像這樣:
lastVal = 2,
lastSeen = [4];
所以現(xiàn)在的邏輯是,您不需要排除之前看到的其他_id值,因?yàn)槟皇钦嬲龑ふ摇癮”的值而不是“小于或等于”lastVal,因?yàn)橹挥小皁ne”在該值處看到的_id值僅排除該值.
這當(dāng)然會產(chǎn)生下一頁使用與上面相同的代碼:
{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }
這是通過結(jié)果“轉(zhuǎn)發(fā)頁面”的最有效方式,對于“排序”結(jié)果的有效分頁特別有用.
但是,如果您想在任何階段“跳轉(zhuǎn)”到第20頁或類似的操作,那么這不適合您.您仍然堅(jiān)持使用傳統(tǒng)的.skip()和.limit()方法來實(shí)現(xiàn)“頁碼”,因?yàn)闆]有其他合理的方法來“計(jì)算”這個(gè).
所以這一切都取決于您的應(yīng)用程序如何實(shí)現(xiàn)“分頁”以及您可以使用的內(nèi)容. .skip()和.limit()方法會受到“跳過”的影響,可以通過此處的方法來避免.
另一方面,如果你想“跳轉(zhuǎn)到頁面”,那么“跳過”是你唯一真正的選擇,除非你想建立一個(gè)結(jié)果的“緩存”.但這完全是另一個(gè)問題.
標(biāo)簽:mongodb-php,php,mongodb,mongodb-query
來源: https://codeday.me/bug/20190918/1811210.html
總結(jié)
以上是生活随笔為你收集整理的php分页排序不变化,php – 计算已排序分页的给定记录的跳过值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语法2
- 下一篇: php libiconv close_u