[英]Problem with aggregate (mongoose) query inside in a for loop
我有一个带有 express 和 mongoDB (mongoose) 的应用程序。
我定义了一个路由,用户在执行 GET 时在其中发送时间戳。
在后面,我执行迭代以查找从引入日期到 8 小时前的一些累积值。 也就是说,我在一个 for 里面有一个聚合:
//Simplified code
let iterations = 8;
let dataAccumulated = [];
for (let i = 0; i < iterations; i++) {
let pipeline = [];
Stream.aggregate(pipeline).exec((error, data) => {
if (error) {
return res.status(500).send({ message: error });
} else {
console.log(data); //Value is displayed for each iteration
dataAccumulated.push(data);
}
});
}
console.log(dataAccumulated) //Empty array --> []
return res.status(200).json(dataAccumulated);
我需要这样做,因为根据提出请求的时间,会进行不同的计算,具体取决于工作班次用户(8 小时/班次)。
Stream.aggregate
是一个异步操作。 因此,您的问题有两个方面。
问题 1:您的聚合在 for 循环中运行; 没有承诺,它不会在设置值之前等待每个任务。
问题 2:您的数据不会记录,因为异步操作尚未完成。
解决方案:使用带有异步函数的 promise 并等待。
async function buildResults() {
for (let i = 0; i < iterations; i++) {
const content = await Stream.aggregate(pipeline).exec((error, data) => {
if (error) {
return res.status(500).send({ message: error });
} else {
console.log(data); //Value is displayed for each iteration
dataAccumulated.push(data);
}
})
}
return dataAccumulated;
}
buildResults().then(data => console.log(data));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.