如何在MongoDB 中實現分頁
雖然由於大規模記憶體消耗,通常不鼓勵使用Skip 進行分頁,但另一種方法是利用_id 字段進行自然排序。
取得最後一個文件的_id
要取得給定頁面上最後一個文件的_id,您可以使用以下指令方法:
<code class="javascript">db.users.find().limit(pageSize); //Find the id of the last document in this page last_id = ...;</code>
前向分頁
前向分頁不是使用.skip() 和.limit(),而是迭代遊標並儲存最後看到的內容_ID。在後續迭代中,查詢被修改為排除已經看到的文檔,同時也將結果限制為 _id 小於或等於上次看到的值的結果。
對於按_id 的自然順序,程式碼如下所示this:
<code class="javascript">var lastSeen = null; var cursor = db.junk.find().limit(3); while (cursor.hasNext()) { var doc = cursor.next(); if (!cursor.hasNext()) lastSeen = doc._id; }</code>
後續頁面的修改查詢
以下查詢用於擷取下一頁:
<code class="javascript">var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);</code>
複雜排序
要按_id 以外的欄位排序(例如排名),您需要追蹤先前看過的文件並使用$nin 運算子將其排除。
這裡是按排名排序的前向分頁範例程式碼片段:
<code class="javascript">var lastSeen = null; var seenIds = []; var cursor = db.junk.find().sort({ "rank": -1 }).limit(2); while (cursor.hasNext()) { var doc = cursor.next(); if ( lastSeen != null && doc.rank != lastSeen ) seenIds = []; seenIds.push(doc._id); if (!cursor.hasNext() || lastSeen == null) lastSeen = doc.rank; }</code>
下一頁的後續查詢將是:
<code class="javascript">var cursor = db.junk.find( { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen } ).sort({ "rank": -1 }).limit(2);</code>
以上是如何使用_id和前向分頁在MongoDB中實現高效分頁?的詳細內容。更多資訊請關注PHP中文網其他相關文章!