MongoDB快速翻頁的方法
翻閱數(shù)據(jù)是MongoDB最常見的操作之一。一個典型的場景是需要在你的用戶界面中顯示你的結(jié)果。如果你是批量處理的數(shù)據(jù),同樣重要的是要讓你的分頁策略正確,以便你的數(shù)據(jù)處理可以規(guī)模化。
接下來,讓我們通過一個例子來看在MongoDB中翻閱數(shù)據(jù)的不同方式。在這個例子中,我們有一個CRM數(shù)據(jù)庫的用戶數(shù)據(jù),我們需要通過翻閱瀏覽和在同一時間顯示10個用戶。所以實際上,我們的頁面大小是10。下方是我們的用戶文檔的結(jié)構(gòu):
{ _id, name, company, state }
方法一:Using skip() 和 limit()
MongoDB本身支持分頁操作使用 skip() 和 limit() 指令。skip(n)指令告訴MongoDB,它應(yīng)該跳過“n”結(jié)果和limit(n)指令指示MongoDB,它應(yīng)該限制結(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ù)的大小增加,這種方法出現(xiàn)嚴重的性能問題。其原因是在每次執(zhí)行查詢時,建立了完整的結(jié)果集,那么服務(wù)器必須從收集的開始走到指定的偏移量。當偏移量增加時,這一過程會變得越來越慢。同時,這個過程沒有有效地使用索引。所以,當你有較小的數(shù)據(jù)集時,典型的“skip() ”和“ limit() ”的方法是有用的。如果您正在使用大數(shù)據(jù)集,您需要考慮其他方法。
方法二:Using find() 和limit()
以前的方法不能很好擴展其原因是skip() 命令。因此,本節(jié)的目標是實現(xiàn)分頁不使用skip()命令。為此,我們將利用在存儲數(shù)據(jù)中的自然順序,比如時間戳或文檔中存儲的標識。
在這個例子中,我們將使用“_id”存儲每個文檔。“_id”是一個MongoDB 的ObjectID結(jié)構(gòu),即 12 字節(jié)結(jié)構(gòu)包含了時間戳、機械加工、進程標識符、計數(shù)器等。總體思路如下 :
檢索當前頁中的最后一個文檔 _id
在下一個頁面檢索文件大于此”_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 = ...
這種方法利用內(nèi)在的規(guī)則存在_id字段。也因為“_id”字段是默認的查找操作,它是非常好的性能指標。如果你使用的字段沒有被索引,那么你在操作中會受到困擾,所以確保字段被索引是非常重要的。
同樣,如果你希望數(shù)據(jù)按照特定順序進行排序分頁的話,那么你還可以使用sort()條款與上述技術(shù)。重要的是要確保排序過程是利用索引來獲得最佳性能。您可以使用.explain()后綴來查詢。
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 = ...
以上就是MongoDB快速翻頁的方法,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用MongoDB中oplog機制實現(xiàn)準實時數(shù)據(jù)的操作監(jiān)控
MongoDB 的Replication是通過一個日志來存儲寫操作的,這個日志就叫做oplog,而下面這篇文章主要給大家介紹了利用MongoDB中oplog機制實現(xiàn)準實時數(shù)據(jù)的操作監(jiān)控的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05MongoDB排序時內(nèi)存大小限制與創(chuàng)建索引的注意事項詳解
在數(shù)據(jù)量超大的情形下,任何數(shù)據(jù)庫系統(tǒng)在創(chuàng)建索引時都是一個耗時的大工程,下面這篇文章主要給大家介紹了關(guān)于MongoDB排序時內(nèi)存大小限制與創(chuàng)建索引的注意事項的相關(guān)資料,需要的朋友可以參考下2022-05-05Linux系統(tǒng)下安裝MongoDB的詳細方法圖文教程
這篇文章主要介紹了Linux系統(tǒng)下安裝MongoDB的詳細方法圖文教程,需要的朋友可以參考下2023-06-06MongoDB??數(shù)據(jù)模型的設(shè)計模式及優(yōu)缺點
這篇文章主要介紹了MongoDB??數(shù)據(jù)模型的設(shè)計模式,在實際開發(fā)中,大多數(shù)性能問題都可以追溯到糟糕的模型設(shè)計,官方也提供分享過文檔模型設(shè)計的進階技巧,這里簡單翻譯記錄一下,需要的朋友可以參考下2022-12-12MongoDB數(shù)據(jù)庫中索引(index)詳解
本文給大家詳細介紹了MongoDB數(shù)據(jù)庫中的索引的知識,優(yōu)缺點以及使用技巧等方面,非常細致,有需要的小伙伴可以參考下2016-11-11Ubuntu中安裝MongoDB及執(zhí)行一些簡單操作筆記
這篇文章主要介紹了Ubuntu中安裝MongoDB及執(zhí)行一些簡單操作筆記,本文同時給出了查看已有數(shù)據(jù)庫、刪除數(shù)據(jù)庫、創(chuàng)建數(shù)據(jù)庫等操作命令實例,需要的朋友可以參考下2014-09-09