溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用MongoDB快速分頁

發(fā)布時間:2020-06-14 22:06:47 來源:網(wǎng)絡 閱讀:5734 作者:UltraSQL 欄目:MongoDB數(shù)據(jù)庫

使用MongoDB快速分頁

 

英文原文:

http://blog.mongodirector.com/fast-paging-with-mongodb/

 

通過你的數(shù)據(jù)分頁是使用MongoDB最常用操作之一。典型的案例是需要在你的UI的表格中顯示結(jié)果。如果你正在批處理數(shù)據(jù),分頁策略正確是很重要的,以致你的數(shù)據(jù)處理可擴展。

 

讓我們通過一個示例來看看在MongoDB中通過數(shù)據(jù)分頁的不同方法。在這個示例中,我們有一個用戶數(shù)據(jù)庫CRM,我們需要分頁并一次顯示10個用戶。因此我們的分頁大小是10.這是我們的用戶文檔結(jié)構(gòu):

{
_id,
name,
company,
state
}

 

方法1:使用skip()和limit()

 

MongoDB本地支持使用skip()和limit()命令的分頁操作。skip(n)命令告訴MongoDB跳過n條結(jié)果,limit(n)命令告訴MongoDB限制結(jié)果長度為“n”個結(jié)果。典型地你會通過游標使用skip()和limit()命令 – 但是為了描述這個案例我們提供了控制臺命令來完成相同的結(jié)果。因為代碼的簡潔性,也排除了檢查代碼的限制。

//Page 1
db.users.find().limit (10)
//Page 2
db.users.find().skip(10).limit(10)
//Page 3
db.users.find().skip(20).limit(10)
........

你明白了。通常獲取第n頁的代碼像這樣:

db.users.find().skip(pagesize*(n-1)).limit(pagesize)

然而隨著數(shù)據(jù)大小的增長,該方法有嚴重的性能問題。原因是每次查詢執(zhí)行時,完整的結(jié)果集被構(gòu)建,然后實例必須從集合的開始定位到特定的偏移位置。因為你的偏移增加,這個過程變得越來越慢。這個過程也不能有效利用索引。因此典型地“skip()”和“l(fā)imit()”方法對于小的數(shù)據(jù)集時是有效的。如果你使用大數(shù)據(jù)集,你需要考慮其他方法。

 

方法2:使用find()和limit()

 

之前的方法擴展得不是很好的原因是skip()命令。因此這部分的目標是不使用“skip()”命令執(zhí)行分頁。我們使用時間戳或文檔中的id以自然順序存儲數(shù)據(jù)。在這個示例中,我們使用存儲在每個文檔中的“_id”。“_id”是一個MongoDB的ObjectID結(jié)構(gòu),是一個12字節(jié)的結(jié)構(gòu),包含時間戳、機器、進程ID、計數(shù)器等。整體想法如下:

1. 獲取當前頁最后文檔的_id

2. 獲取大于該“_id”的下一頁的文檔


//Page 1
db.users.find().limit(pageSize);
//Find the id of the last document in this page
last_id = ...
//Page 2
users = db.users.find({'_id'> last_id}). limit(10);
//Update the last id with the id of the last document in this page
last_id = ...


該方法保持了存在于“_id”列中的固有順序。也因為“_id”列默認被索引,查找性能非常好。如果你正使用的列沒有被索引,你的性能將會變差 -- 因此確保該列有索引是很重要的。


如果你也想為你的分頁以特定順序排列數(shù)據(jù),你可以用以上技術使用sort()從句。確保排序過程覆蓋索引獲得最佳性能非常重要。你可以使用.explain后綴到你的查詢?nèi)Q定。

users = db.users.find({'_id'> last_id}). sort(..).limit(10);
//Update the last id with the id of the last document in this page
last_id = ...


一如既往如果你有任何問題或者評論請隨時聯(lián)系我們support@mongodirector.com

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI