繁体   English   中英

for 循环中的聚合(猫鼬)查询问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM