Stworzyłem pętlę, aby wykonać wiele zapytań, takich jak następujące elementy:

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

});

Problemem jest teraz, że MongoDB zwraca dane asynchronicznie, co oznacza, że czasami otrzymuję dane w innym wierszu. Moje pytanie brzmi, jak mogę wykonać 10 zapytań z różnymi datami w tym samym rzędzie, aby uzyskać za każdym razem, sama tablica. Lub jak mogę poprawić moją pętlę, aby poczekać, aż każda operacja skończyła

0
Silas 26 lipiec 2020, 11:23

1 odpowiedź

Najlepsza odpowiedź

Możesz użyć pętli for of, która obsługuje async / czeka na czek na każde zapytanie przed wysłaniem odpowiedzi. Może to wyglądać jak następujące:

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)
  }
});
0
antonku 26 lipiec 2020, 08:34