第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在MongoDB中實(shí)現(xiàn)分頁(yè)

在MongoDB中實(shí)現(xiàn)分頁(yè)

蕭十郎 2019-07-13 16:01:02
我知道這是個(gè)不好的做法skip為了實(shí)現(xiàn)分頁(yè),因?yàn)楫?dāng)您的數(shù)據(jù)變得很大時(shí)skip開(kāi)始消耗大量?jī)?nèi)存。克服這一麻煩的一種方法是利用自然秩序_id字段://Page 1db.users.find().limit(pageSize);//Find the id of the last document in this pagelast_id = ... //Page 2users = db.users.find({'_id'> last_id}). limit(10);問(wèn)題是-我對(duì)芒果不熟悉,不知道怎樣才能做到這一點(diǎn)last_id
查看完整描述

1 回答

?
天涯盡頭無(wú)女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

您正在討論的概念可以稱為“前向分頁(yè)”。一個(gè)很好的理由是不像使用.skip().limit()修飾符不能用于“返回”到前一頁(yè),也不能“跳過(guò)”到特定頁(yè)。至少在存儲(chǔ)“已見(jiàn)”或“已發(fā)現(xiàn)”頁(yè)面方面沒(méi)有付出很大的努力,所以如果這種類型的“鏈接到頁(yè)”分頁(yè)是您想要的,那么最好還是堅(jiān)持使用.skip().limit()方法,盡管存在性能缺陷。

如果只有“向前”才是可行的選擇,那么以下是基本概念:

db.junk.find().limit(3){ "_id" : ObjectId("54c03f0c2f63310180151877"), "a" : 1, "b" : 1 }{ "_id" :
 ObjectId("54c03f0c2f63310180151878"), "a" : 4, "b" : 4 }{ "_id" : ObjectId("54c03f0c2f63310180151879"), "a" : 10, "b" : 10 }

當(dāng)然,這是你的第一頁(yè),限制為3項(xiàng)。現(xiàn)在考慮一下,在代碼迭代游標(biāo)時(shí):

var lastSeen = null;var cursor = db.junk.find().limit(3);while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if (!cursor.hasNext())
     lastSeen = doc._id;}

以便迭代游標(biāo)并執(zhí)行某些操作,并且當(dāng)?shù)竭_(dá)游標(biāo)中的最后一項(xiàng)時(shí),則存儲(chǔ)lastSeen對(duì)現(xiàn)在的價(jià)值_id:

ObjectId("54c03f0c2f63310180151879")

在隨后的迭代中,您只需提供_id值,該值(在會(huì)話中或其他方面)保存在查詢中:

var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if (!cursor.hasNext())
     lastSeen = doc._id;}{ "_id" : ObjectId("54c03f0c2f6331018015187a"), "a" : 1, "b" : 1 }{ "_id" :
     ObjectId("54c03f0c2f6331018015187b"), "a" : 6, "b" : 6 }{ "_id" : ObjectId("54c03f0c2f6331018015187c"), "a" : 7, "b" : 7 }

這個(gè)過(guò)程一遍又一遍地重復(fù),直到找不到更多的結(jié)果。

這是自然秩序的基本過(guò)程,如_id..對(duì)于其他的事情,它會(huì)變得更復(fù)雜一些。考慮以下幾點(diǎn):

{ "_id": 4, "rank": 3 }{ "_id": 8, "rank": 3 }{ "_id": 1, "rank": 3 }    { "_id": 3, "rank": 2 }

要將其分成兩頁(yè),按排名排序,那么您需要知道的是,您已經(jīng)“看到”了什么,并排除了這些結(jié)果。所以看第一頁(yè):

var lastSeen = null;var seenIds = [];var cursor = db.junk.find().sort({ "rank": -1 }).limit(2);while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if ( lastSeen != null && doc.rank != lastSeen )
       seenIds = [];
   seenIds.push(doc._id);
   if (!cursor.hasNext() || lastSeen == null)
     lastSeen = doc.rank;}{ "_id": 4, "rank": 3 }{ "_id": 8, "rank": 3 }

在下一次迭代中,您希望小于或等于lastSeen的“排名”分?jǐn)?shù),但也不包括那些已經(jīng)看到的文檔。你用$nin操作員:

var cursor = db.junk.find(
    { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen }).sort({ "rank": -1 }).limit(2);while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if ( lastSeen != null && doc.rank != lastSeen )
       seenIds = [];
   seenIds.push(doc._id);
   if (!cursor.hasNext() || lastSeen == null)
     lastSeen = doc.rank;}{ "_id": 1, "rank": 3 }    { "_id": 3, "rank": 2 }

實(shí)際持有多少個(gè)“seenIds”取決于您的結(jié)果有多“粒度”,該值可能會(huì)發(fā)生變化。在這種情況下,您可以檢查當(dāng)前的“排名”分?jǐn)?shù)是否等于lastSeen價(jià)值與拋棄seenIds滿足,所以它不會(huì)增長(zhǎng)到很多。

這是“前向分頁(yè)”的基本概念,供您練習(xí)和學(xué)習(xí)。


查看完整回答
反對(duì) 回復(fù) 2019-07-13
  • 1 回答
  • 0 關(guān)注
  • 867 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)