Javascript Node.js MongoDB使用async/await从数据库批量批处理文档
我正在尝试从数据库中提取一组大容量文档以进行处理 对于测试,我在db中有17个文档,使用mongodbJavascript Node.js MongoDB使用async/await从数据库批量批处理文档,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在尝试从数据库中提取一组大容量文档以进行处理 对于测试,我在db中有17个文档,使用mongodb2.2.31 这是我的密码 const query = collection.find({}).batchSize(10); while(await query.hasNext()) { const docs = await query.toArray(); console.log(await query.hasNext()); log.info(docs.length); } 当
2.2.31
这是我的密码
const query = collection.find({}).batchSize(10);
while(await query.hasNext()) {
const docs = await query.toArray();
console.log(await query.hasNext());
log.info(docs.length);
}
当我运行这个时,进程将永远运行注销17
如果我使用forEach方法:
const query = collection.find({}).batchSize(10);
(await query.toArray()).forEach(function(data) {
log.info(data._id.toString())
});
该流程仅使用每个文档id运行17个日志行
我不明白为什么。hasNext总是返回true
--------------更新---------------
所以我通过这样做解决了它,它不是完美的,因为它对每个文档都有一个请求,我真的想做一个从db返回1000个文档的请求
我不确定这是否对我有用,因为我收集了1.7亿张唱片
const query = collection.find({});
let docs = [];
while (await query.hasNext()) {
docs.push(await query.next());
if (docs.length >= 1000) {
await processDocs([...docs]);
docs = [];
}
}
processDocs(docs);
toArray
和hasNext
并不一定要一起使用,而且toArray
总是返回光标中的所有文档,而不管批大小。@JohnnyHK奇怪的是,在文档中没有这样的说法,那么如何一次获得所有10个文档呢?hasNext
通常与nextObject
一起使用,不toArray
。您可以使用nextObject
进行自己的客户端批处理,也可以将链接到查询中。限制(10)
,只获取前10个结果。@JohnnyHK在讨论时最好坚持使用已发布的API方法。这将是(而不是nextObject
)。对于作者来说,另一个明显的误解似乎是关于batchSize()
的用途。如前所述,您的问题中的陈述可能是指.limit()
。基本上是“我希望有10份文件”。实际的batchSize
指的是驱动程序一次从服务器获取的文档数量,而不是对光标上的总结果的限制。@NeilLunn但是通过使用限制,只会给我10条记录,我想要全部17条,但一批10条。在我的实际代码中,我有数百万条记录,并希望以500次为一批处理。如果我使用limit,它将不会遍历所有对象。