根据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];
我仍然得到了结果。
我的问题是:
myCurse.toArray()[i];
其中i
是索引,在下面实现一个数组,以便可以多次使用myCurse.toArray()[i];
。 使用MongoDB 3.2.8
答案 0 :(得分:1)
Cursor.toArray()
遍历整个游标,将结果放入数组,直到没有更多结果。光标现在已经消耗了#34;如果你愿意,但结果是一个完全正常的数组。
这些文件将在RAM中,直到垃圾收集消除它。换句话说,至少只要您保留对数组或数组中任何条目的引用。之后,所有赌注都已关闭。它们可能会被快速移除,或者可能会暂时停留一段时间,但通常不需要担心。
我从未遇到过返回文档大小超过RAM大小的情况,但我希望在可用的情况下使用页面文件(如果允许应用程序使用那么多RAM),然后最后,当你的内存不足时会出现异常。如果您需要以这种方式处理大量数据,请不要使用toArray()
,因为它无论如何都会非常低效。