Cursor.toArray()实现

时间:2016-11-09 18:01:26

标签: mongodb

根据MongoDB手册,下面的代码耗尽了数组,并将查询返回的文档存储到RAM中:

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大小会怎样?
  4. 使用MongoDB 3.2.8

1 个答案:

答案 0 :(得分:1)

Cursor.toArray()遍历整个游标,将结果放入数组,直到没有更多结果。光标现在已经消耗了#34;如果你愿意,但结果是一个完全正常的数组。

这些文件将在RAM中,直到垃圾收集消除它。换句话说,至少只要您保留对数组或数组中任何条目的引用。之后,所有赌注都已关闭。它们可能会被快速移除,或者可能会暂时停留一段时间,但通常不需要担心。

我从未遇到过返回文档大小超过RAM大小的情况,但我希望在可用的情况下使用页面文件(如果允许应用程序使用那么多RAM),然后最后,当你的内存不足时会出现异常。如果您需要以这种方式处理大量数据,请不要使用toArray(),因为它无论如何都会非常低效。