提问者:小点点

Nodejs Mongodb在一个http调用中执行多个查询


我创建了一个循环来执行多个查询,如以下代码所示:

router.get('/getAverageClicks', async (req, res) => {
if(req.headers.token == process.env.API_TOKEN){
    let clicks = [];
    database.collection('locations').countDocuments().then(loccount => {
        for (var i = 0; i <= 10; i++) {
            var past = new Date();
            past.setDate(past.getDate() - i);
            var tpast = new Date();
            tpast.setDate(tpast.getDate() -1 -i)

            console.log(tpast);
            var query = { $and : [ {date: {$lte: past}},{date: {$gte: tpast}}]};
            collection.countDocuments(query).then(count => {
                console.log(count)
                clicks.push(count/loccount);
                if (clicks.length == 10){
                res.end(JSON.stringify(clicks.reverse()));
                res.status(200);
                }
            }); 
        }
    })

}else{
    res.end("Unauthorized")
    res.status(401)
}

});

现在的问题是mongodb异步返回数据,这意味着我有时会在不同的行中获得数据。 我的问题是如何在同一行中执行10个不同日期的查询,每次都得到相同的数组。 或者我如何改进循环,直到每个操作完成


共1个答案

匿名用户

您可以使用支持async/await的for of循环,在发送响应之前等待每个查询。 它可能如下所示:

router.get('/getAverageClicks', async (req, res) => {
  if (req.headers.token == process.env.API_TOKEN) {
    const loccount = await database.collection('locations').countDocuments();
    let clicks = [];
    for (const i of [...new Array(11)].keys()) {
      var past = new Date();
      past.setDate(past.getDate() - i);
      var tpast = new Date();
      tpast.setDate(tpast.getDate() - 1 - i)

      console.log(tpast);
      var query = { $and: [{ date: { $lte: past } }, { date: { $gte: tpast } }] };
      const count = await collection.countDocuments(query);
      console.log(count)
      clicks.push(count / loccount);
    }
    res.end(JSON.stringify(clicks.reverse()));
    res.status(200);
  } else {
    res.end("Unauthorized")
    res.status(401)
  }
});