2016-11-09 51 views
0

根據MongoDB的說明書,下面的代碼耗盡了陣列和存儲該查詢返回的文檔到RAM:Cursor.toArray()實現

var myCurse = db.coll.find(); 
var docs = myCurse.toArray() 

如果我在命令輸入:

myCurse.forEach(printjson); 

前兩個命令後,沒有任何返回。所以基本上光標已經耗盡。這裏看起來不錯。

現在如果做如下:

var myCurse = db.coll.find(); 
myCurse.toArray()[1]; 

然後:

myCurse.toArray()[2]; 

我仍然得到結果。

我的問題是:

  1. 確實myCurse.toArray()[i];其中i是索引,下方實現陣列,使得myCurse.toArray()[i];可以利用多次。
  2. 文件在RAM中存儲多長時間?
  3. 如果返回文檔的大小超過RAM大小,會發生什麼情況?

使用的MongoDB 3.2.8

回答

1

Cursor.toArray()穿過整個光標,把結果到一個數組,直到沒有更多的結果。如果你願意,光標現在被「擴大」,但結果是一個完全正常的數組。

這些文件將在RAM中,直到垃圾收集擺脫它。換句話說,至少只要你保持對數組或數組中任何條目的引用即可。之後,所有投注都關閉。他們可能會被迅速刪除,或者他們可能會停留一段時間,但通常不需要擔心。

我從來沒有遇到過返回的文檔大小超過RAM大小的場景,但我希望頁面文件將被使用(如果應用程序被允許使用那麼多的RAM),然後最終當內存不足時會出現異常。如果您需要以這種方式處理大量數據,請不要使用toArray(),因爲它無論如何效率極低。