2013-10-21 45 views
3

我遍歷一個Mongo DB集合。這個集合有數百萬個文檔。我正在使用Java API進行此迭代。這種迭代練習可能會持續一段時間,我們不想影響應用程序的性能。所以我們計劃在這個迭代過程中使用Thread.sleep。但是我們正面臨着光標超時的問題。任何人都面對過這個?另外,是否有可能以塊的形式讀取數據,例如100個文件一次?MongoDB光標問題,而迭代一個巨大的集合

+0

無論如何,遊標只返回塊,但如果你想手動管理它,你可以設置跳過和限制,就像在SQL查詢中一樣,例如http://docs.mongodb.org/manual/reference/method/cursor .skip/ – Trisha

回答

2

而不是在整個集合上使用遊標,您可以嘗試通過_id對集合進行分頁。因此,每次查詢100個文檔(按_id排序)並保留您遇到的最後一個_id。然後在每個連續的查詢中使用一個條件來獲取文檔,其中_id> last_id來自之前的提取。

+4

光標會自動尋找您的頁面,它不會一次從服務器獲取所有的頁面。遊標只在第一次抓取時返回101個文檔,並且如果需要,它將不可見地返回到服務器以請求更多(請參閱http://docs.mongodb.org/manual/core/cursors/)。因此,不需要以這種方式手動翻頁 – Trisha

+0

或者如果您確實必須手動分頁,請使用跳過和限制組合。 – evanchooly

+4

跳過並限制不會在大型收藏中的深度頁面上提供良好的性能,因爲跳過仍然需要實際跳過以前的結果。 –