2011-12-05 45 views
7

我需要分頁收集文章(按日期排序 - 除此之外別無其他)。在Mongodb中做這樣的標準方式是什麼?如何在Mongodb中實現分頁?

由於性能問題,我不打算使用skip()方法。我也不打算使用$ push方法。我所見過的最接近的方法是範圍查詢方法。但是,如果任何已排序的項目被刪除,它似乎會失敗。

+2

接受答案並關閉此問題 – beNerd

回答

9

範圍排序應該適合你。首先要求將前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限制,更大的集合。

基於範圍的分頁可以更好地使用索引,但不允許 您可以輕鬆地跳轉到特定頁面。

+0

使用日期類型的範圍查詢/頁面標記不起作用,因爲您將得到具有相同日期的多個記錄的不一致性。我會爲此使用_id值標記。所有這些都是爲了避免跳躍(N)時的o(N)表現。 –

+0

啊hhhh在mongodb中調頁很繁瑣嗎?我希望10gen的人向我們展示他們如何推薦分頁。 –

+0

@LulZilla:看看我的更新,它來自mongodb文檔。 –

0

如果您可以對索引進行排序,則可以使用「$ min」和「$ max」查詢修飾符或範圍查詢來實現高效的分頁。確保您的索引最後包含一個獨特的屬性(例如「_id」)。

如果您無法對索引進行排序,則可以預處理完整的結果集並按順序保留「_id」值的列表。然後,您可以使用「$ in」查詢運算符獲取該列表的範圍並查找結果頁面。