gpt4 book ai didi

javascript - Mongoose 聚合游标 promise

转载 作者:搜寻专家 更新时间:2023-11-01 00:30:29 25 4
gpt4 key购买 nike

我正在尝试聚合大型数据集,因此我将游标与聚合一起使用。但是,如果不使用额外的延迟,我找不到关于如何实现它的文档。我觉得必须有一种方法可以将 aggregate().cursor().each() 与在聚合完成后解决的 promise 相结合。有谁知道如何做到这一点?

此代码有效并基于 http://mongoosejs.com/docs/api.html#aggregate_Aggregate-cursor我正在尝试找到一种无需额外 promise 即可执行此操作的方法。

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;

最佳答案

我发现这个 SO 正在寻找有关使用带有 promise 的聚合游标的一般帮助。经过大量的试验和错误,如果其他人偶然发现了这一点,我发现游标对象有一个返回 promise 的 next() 方法,就像其他游标一样。出于某种原因,如果没有 async 标志,我无法获得对它的引用。因此,如果您使用的是 bluebird :

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"); })

Mongoose 5 更新

exec() 调用不再返回 promise ,仅返回游标本身,并且不再需要 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"); )

关于javascript - Mongoose 聚合游标 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37016641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com