我需要分頁收集文章(按日期排序 - 除此之外別無其他)。在Mongodb中做這樣的標準方式是什麼?如何在Mongodb中實現分頁?
由於性能問題,我不打算使用skip()方法。我也不打算使用$ push方法。我所見過的最接近的方法是範圍查詢方法。但是,如果任何已排序的項目被刪除,它似乎會失敗。
我需要分頁收集文章(按日期排序 - 除此之外別無其他)。在Mongodb中做這樣的標準方式是什麼?如何在Mongodb中實現分頁?
由於性能問題,我不打算使用skip()方法。我也不打算使用$ push方法。我所見過的最接近的方法是範圍查詢方法。但是,如果任何已排序的項目被刪除,它似乎會失敗。
範圍排序應該適合你。首先要求將前10個項目按日期排序:
db.articles.find({}).sort({ date : -1 }).limit(10);
這之後,您將需要儲存的最後一個項目的某個日期,並在接下來的尋呼請求使用ID:
db.articles.find({"date": {$lt: storedDateOfLastItem}}).sort({ date : -1 }).limit(10);
所以,我想它應該爲你工作。要估算總頁數,您需要使用count。
但它似乎失敗,如果任何排序項目被刪除。
如果您將從第#1頁移除文章,確保因存儲上次日期而中斷第2頁將被更改。爲了避免如果這個數被改變,這是目前保存日期
db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort({ date : -1 }).count()
之前的項目這一點,你可以估算數(讓說,2 articled被刪除)。您需要更新storedDateOfLastItem
db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort({ date : -1 }).take(2)
再從上述請求的最後一個項目採取storedDateOfLastItem並繼續使分頁。
但我的意見只是保持這種分頁,因爲它是沒有額外的邏輯,因爲我想刪除文章是罕見的操作。
從MongoDB的文檔:
尋呼成本不幸的是跳過即可(非常)昂貴,需要 服務器從集合,或索引的開始行走,讓 爲偏置/跳過位置才能開始返回 數據頁(限制)。隨着頁面號增加,跳過將變得更慢,並且更多的CPU密集,並且可能IO限制,更大的集合。
基於範圍的分頁可以更好地使用索引,但不允許 您可以輕鬆地跳轉到特定頁面。
使用日期類型的範圍查詢/頁面標記不起作用,因爲您將得到具有相同日期的多個記錄的不一致性。我會爲此使用_id值標記。所有這些都是爲了避免跳躍(N)時的o(N)表現。 –
啊hhhh在mongodb中調頁很繁瑣嗎?我希望10gen的人向我們展示他們如何推薦分頁。 –
@LulZilla:看看我的更新,它來自mongodb文檔。 –
如果您可以對索引進行排序,則可以使用「$ min」和「$ max」查詢修飾符或範圍查詢來實現高效的分頁。確保您的索引最後包含一個獨特的屬性(例如「_id」)。
如果您無法對索引進行排序,則可以預處理完整的結果集並按順序保留「_id」值的列表。然後,您可以使用「$ in」查詢運算符獲取該列表的範圍並查找結果頁面。
接受答案並關閉此問題 – beNerd