mongoose聚合游标的承诺

我想要聚合一个大型的数据集,所以我正在使用游标和聚合。 但是,我无法find有关如何实现这个没有使用额外的延期文件。 我觉得必须有一种方法来结合aggregate().cursor().each()和在聚合完成后parsing的promise。 有谁知道如何做到这一点?

此代码的工作原理是基于http://mongoosejs.com/docs/api.html#aggregate_Aggregate-cursor我想find一种方法来做到这一点,没有额外的承诺。

 aggregation = MyModel.aggregate().group({ _id: '$name' }); deferred = Q.defer(); aggregation.cursor({ batchSize: 1000 }).exec().each(function(err, doc) { if (err) { return deferred.reject(err); } if (!doc) { return deferred.resolve(); // done } // do stuff with doc }); return deferred.promise; 

我发现这样做寻找与承诺一起使用聚合游标的一般帮助。 经过大量的试验和错误,如果其他人绊倒在这,我发现游标对象有一个next()方法返回一个承诺,像其他游标。 出于某种原因,我不能没有async标志的引用。 所以,如果你使用蓝鸟:

 let bluebird = require("bluebird"); 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"); })