2016-05-30 50 views
0

我有大量由用戶創建的帖子。當用戶向下滾動時,我將加載另外20個這些帖子並將它們推送到頁面(如無限滾動)。如何檢索比特定ID更早的文檔?

爲了實現這一點,我需要檢索比最後加載的帖子ID更早的文檔。

我在我的應用程序使用貓鼬,所以這是我會怎麼寫呢:

Post.find({"_id": {"$gt": myLastId}}).limit(20).sort({"created": -1}).exec(function(err, posts) {...} 

雖然,從邏輯上講,我看不到,因爲通過生成所有我的帖子的ID的GUID這個工作貓鼬(如574c255db7fdb529fb38c5ab)。

我可以使用created屬性(在創建時默認爲Date.now()),但是在同一時間創建帖子時極少發生這種情況?

我能想到的唯一的另一種方式是在架構中創建一個index,該架構將從0開始,並且我可以找到接下來的20個帖子,其中index比傳遞的更早。這是一個好方法,還是有更好的方法呢?

回答

1

你的方法與{"_id": {"$gt": myLastId}}其實很好。 MongoDB ID對創建時間進行編碼,這就是它工作的原因。 (請參閱docsthis explanatory blog。)

添加增量索引需要集合級別鎖定,因此對於大量寫入可能會產生問題。

+0

謝謝扎克,效果很棒! – Fizzix

0

把它當作其他的尋呼功能嗎?即保留一個頁面索引,一個resultsPerPage變量,計算需要跳過多少個頁面,並在搜索或客戶端查找下一個請求後更新頁面索引?

我不使用貓鼬所以這裏是一個天然的例子:

collection.find({}).limit(resultsPerPage).skip(resultsPerPage*(page-1)) 

或者這樣的事情,你應該明白我的意思。但是,您應該儘量避免大量跳過,但我不認爲這個問題是關於優化的。

+0

如果在查看頁面的某個人中創建了新的「posts」,會發生什麼?例如,如果他們正在查看前20個結果,那麼由於新的「posts」被創建,第二批20個結果是否不包含來自第一批的'posts'? – Fizzix

+1

是的,你是對的!我已經看到O'Reilly的'MongoDB:權威指南'中提到的確切要求,但我沒有在工作中與我一起。如果你今天晚上沒有回答你的問題,我會回到你那裏提到的解決方案。 – RobbyD

+0

不好意思,昨天不回來。但O'Reilly的書幾乎可以提供你現在所用的確切方法。除了它在日期上使用明確的排序,但我很確定ObjectID是唯一足以永遠不會遇到您當前的代碼問題。 – RobbyD

相關問題