Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js MongoDB使用async/await从数据库批量批处理文档_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript Node.js MongoDB使用async/await从数据库批量批处理文档

Javascript 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); } 当

我正在尝试从数据库中提取一组大容量文档以进行处理

对于测试,我在db中有17个文档,使用mongodb
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,它将不会遍历所有对象。