2016-11-09 47 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(),因为它无论如何效率极低。