Javascript 猫鼬聚集光标承诺
我正在尝试聚合一个大型数据集,因此我将光标与聚合一起使用。然而,我找不到关于如何在不使用额外延迟的情况下实现这一点的文档。我觉得必须有一种方法将Javascript 猫鼬聚集光标承诺,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我正在尝试聚合一个大型数据集,因此我将光标与聚合一起使用。然而,我找不到关于如何在不使用额外延迟的情况下实现这一点的文档。我觉得必须有一种方法将aggregate().cursor().each()与聚合完成后解决的承诺结合起来。有人知道怎么做吗 这段代码是基于 我正试图找到一种方法来做到这一点,而不需要额外的承诺 aggregation=MyModel.aggregate().group({ _id:“$name” }); 延迟=Q.延迟(); 聚合游标({ 批量大小:1000 }).exe
aggregate().cursor().each()
与聚合完成后解决的承诺结合起来。有人知道怎么做吗
这段代码是基于
我正试图找到一种方法来做到这一点,而不需要额外的承诺
aggregation=MyModel.aggregate().group({
_id:“$name”
});
延迟=Q.延迟();
聚合游标({
批量大小:1000
}).exec().each(函数(err,doc){
如果(错误){
延迟返回。拒绝(错误);
}
如果(!doc){
返回deferred.resolve();//完成
}
//和医生做点什么
});
回报。承诺代码>我发现了这一点,所以我正在寻找有关使用聚合游标和承诺的一般帮助。经过大量的尝试和错误,如果有人发现了这个问题,我发现cursor对象有一个next()方法,与其他游标一样,它返回一个承诺。但是,由于某种原因,如果没有async
标志,我无法获得对它的引用。因此,如果您使用的是蓝鸟:
let bluebird = require("bluebird");
let aggregation = MyModel.aggregate().group({
_id: '$name'
});
aggregation.cursor({
batchSize: 1000,
async: true
}).exec().then(cursor => {
return bluebird.coroutine(function* () {
let doc;
while ((doc = yield cursor.next())) {
console.log(doc._id)
}
})()
}).then(() => { console.log("done with cursor"); })
猫鼬5更新
exec()
调用不再返回承诺,只返回光标本身,并且不再需要async:true
属性
let aggregation = MyModel.aggregate().group({
_id: '$name'
});
(async function () {
let doc, cursor;
cursor = aggregation.cursor({batchSize: 1000}).exec();
while ((doc = await cursor.next())) {
console.log(doc._id)
}
})()
.then(() => console.log("done with cursor"); )
我可能误读了,但我认为在第一个代码示例的while块中有一个额外的打开参数(
)`while((doc=yield cursor.next()){console.log(doc.\u id)}“谢谢……这实际上是一个缺失的结束语。如果你想对每个文档进行异步更新,这不会有帮助,或者我遗漏了什么?