次のコードが示すように、複数のクエリを実行するためのループを作成しました。
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個のクエリを実行して、毎回同じ配列を取得するにはどうすればよいかということです。または、すべての操作が完了するまで待機するようにループを改善するにはどうすればよいですか?
for of
async / awaitをサポートするループを使用して、応答を送信する前にすべてのクエリを待機できます。次のようになります。
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)
}
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加