这是Stackoverflow问题的后续问题:Async Cursor Iteration with Asynchronous Sub-task。这一次略有不同。
在迭代MongoDB文档时,如果目标数据库大小太大,任务将在中间停止。 (单个集合中有超过3000个文档,每个文档都包含冗长的文本,因此.toArray
由于内存限制而不可行.3000只是整个数据的一部分,完整数据可能超过10,000文件。)我注意到集合中的文档数量是否大于约。 750,它只是在任务中间停止。
我搜索过以前的Stackoverflow问题来解决这个问题:有人说对大型集合进行迭代需要使用stream
,each
或map
代替for/while
{ {1}}。当我在现实生活中尝试这些建议时,其中没有一个确实起作用。它们也只是停在中间,与cursor
迭代几乎没有区别。我真的不喜欢扩展for/while
的想法,因为它可能让timeout
落后于记忆,但它也无效。
以下所有方法都在cursor
条件
流方法
async
while / for method(只需将const cursor = db.collections('mycollection').find()
cursor.on('data', doc => {
await doSomething(doc)//do something with doc here
})
替换为while
)
for
map / each / foreach方法(将const cursor = db.collections('mycollection').find()
while ( await cursor.hasNext() ) {
let doc = await cursor.next()
await doSomething(doc)
}
替换为map
)
foreach/each
它们都没有显示出对方的任何差异。他们只是在大约周围迭代时停止。 750个文件,只是挂起。我甚至尝试在const cursor = db.collections('mycollection').find()
cursor.map(async doc=>{
await doSomething(doc)
})
队列上注册每个文档并稍后执行Promise.all
任务,以便在迭代时光标不会花费太多时间,但会出现同样的问题。
编辑:我认为async/await
会混淆其他读者。所以我创建了一个示例代码,以便您可以重现问题。
doSomething()
测试运行我道歉。。它实际上迭代了所有文件...我认为我其他部分确实做错了。我会详细说明这个与导致麻烦的其他部分。