使用MongoDB快速分頁
我們提供的服務有:網站制作、成都網站設計、微信公眾號開發、網站優化、網站認證、薩爾圖ssl等。為1000+企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的薩爾圖網站制作公司
英文原文:
http://blog.mongodirector.com/fast-paging-with-mongodb/
通過你的數據分頁是使用MongoDB最常用操作之一。典型的案例是需要在你的UI的表格中顯示結果。如果你正在批處理數據,分頁策略正確是很重要的,以致你的數據處理可擴展。
讓我們通過一個示例來看看在MongoDB中通過數據分頁的不同方法。在這個示例中,我們有一個用戶數據庫CRM,我們需要分頁并一次顯示10個用戶。因此我們的分頁大小是10.這是我們的用戶文檔結構:
{ _id, name, company, state }
方法1:使用skip()和limit()
MongoDB本地支持使用skip()和limit()命令的分頁操作。skip(n)命令告訴MongoDB跳過n條結果,limit(n)命令告訴MongoDB限制結果長度為“n”個結果。典型地你會通過游標使用skip()和limit()命令 – 但是為了描述這個案例我們提供了控制臺命令來完成相同的結果。因為代碼的簡潔性,也排除了檢查代碼的限制。
//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)
然而隨著數據大小的增長,該方法有嚴重的性能問題。原因是每次查詢執行時,完整的結果集被構建,然后實例必須從集合的開始定位到特定的偏移位置。因為你的偏移增加,這個過程變得越來越慢。這個過程也不能有效利用索引。因此典型地“skip()”和“limit()”方法對于小的數據集時是有效的。如果你使用大數據集,你需要考慮其他方法。
方法2:使用find()和limit()
之前的方法擴展得不是很好的原因是skip()命令。因此這部分的目標是不使用“skip()”命令執行分頁。我們使用時間戳或文檔中的id以自然順序存儲數據。在這個示例中,我們使用存儲在每個文檔中的“_id”。“_id”是一個MongoDB的ObjectID結構,是一個12字節的結構,包含時間戳、機器、進程ID、計數器等。整體想法如下:
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”列默認被索引,查找性能非常好。如果你正使用的列沒有被索引,你的性能將會變差 -- 因此確保該列有索引是很重要的。
如果你也想為你的分頁以特定順序排列數據,你可以用以上技術使用sort()從句。確保排序過程覆蓋索引獲得最佳性能非常重要。你可以使用.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 = ...
一如既往如果你有任何問題或者評論請隨時聯系我們support@mongodirector.com
網頁名稱:使用MongoDB快速分頁
網站網址:http://vcdvsql.cn/article44/peiphe.html
成都網站建設公司_創新互聯,為您提供自適應網站、關鍵詞優化、App開發、虛擬主機、電子商務、域名注冊
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯