日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php分页排序不变化,php – 计算已排序分页的给定记录的跳过值

發(fā)布時(shí)間:2023/12/10 php 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php分页排序不变化,php – 计算已排序分页的给定记录的跳过值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我正在嘗試使用php驅(qū)動(dòng)程序計(jì)算mongo db集合中給定記錄的跳過值.因此,獲取給定記錄,找出整個(gè)集合中該記錄的索引.這可能嗎?

目前我正在選擇所有記錄并手動(dòng)對結(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是存儲(chǔ)在類似“會(huì)話變量”之類的東西,而不是在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)然會(huì)產(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()方法會(huì)受到“跳過”的影響,可以通過此處的方法來避免.

另一方面,如果你想“跳轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。