Mongodb cursor.toArray()已成为瓶颈

Mongodb cursor.toArray()已成为瓶颈。 我需要处理200万个文件并输出到一个文件。 我一次处理10,000个使用跳过和限制选项,但它没有工作。 所以我正在寻找一个更高效的驱动程序。 我也试图一次处理10个文件,这是永久的,所以我不确定.each()是否可以解决这个问题? 每次我们检索单个文档时,.nextObject是否会进行networking调用?

Node.js在内存上也有1.5GB的内部限制,所以我不知道如何处理这些文件。 我相信只要在应用程序级别使用正确的方式使用mongo游标,而不是执行任何数据库级别的聚合,就可以解决此问题。

不需要保存所有文档,因为您可以将每个文档写入到从服务器接收到的文件中。 如果您使用.eachbatchSize的游标, .each可以将每个文档写入该文件,在客户端保留不超过batchSize文档:

 db.collection.find(query, { "batchSize" : 100 }).each(writeToFile) 

从Node.js驱动程序API文档

如果指定了批量大小,光标在任何给定的时间将只保存最大批量元素

使用跳过和限制来分解结果是一个坏主意。 跳过n且限制为m通常必须至less扫描n + m文档或索引条目。 如果您使用skip和limit进行分页,那么您最终会使查询在(总结果数量/限制总数)的大小上做二次方面的工作量,例如对于1000个文档和100个限制,扫描的总文档将会按照…的顺序

 100 + 200 + 300 + 400 + ... + 1000 = 100 (1 + 2 + 3 + 4 + ... + 10)