#javascript #mongodb #mongoose #async-await
#javascript #mongodb #mongoose #async-await
Вопрос:
У меня есть база данных футбольных матчей, и у меня следующая ситуация: повышение> = 6 очков и вылет <4 очка.
Я в 1-м сезоне, 8-й дивизион. В моей базе данных есть 1 совпадение, относящееся к 1 сезону, это была победа, поэтому 3 очка.
Затем у меня есть [{«сезон»: «1», «Оценка»: «1-0»}, {«сезон»: «1», «Оценка»: «2-0»}, {«сезон»: «2», «Оценка»: «3-0»}]
Первые два совпадения в массиве относятся к сезону 1, поэтому я знаю, что это дивизион 8.
Для третьего матча мне нужно проверить результат сезона 1, чтобы узнать, в каком дивизионе должен быть сезон 2. Моя проблема в том, что когда я проверяю это, он проверяет только на основе самого первого совпадения и указывает 3 балла, когда должно быть 9 баллов.
Как мне заставить Mongoose использовать последний снимок моей базы данных, а не один с самого начала функции?
Matches.js
const router = require('express').Router();
const Match = require('../../models/match.model');
const getSeasonData = require('./getSeasonData');
router.route('/getNewMatches').post(auth, async (req, res) => {
const matches = await Match.find();
const getDivisionBasedOnSeasonResult = async () => {
const seasonData = await getSeasonData(seasonOfLastGame);
console.log({ seasonData });
switch (seasonData[0].seasonResult) {
case "Promoted":
return seasonData[0].division - 1;
case "Remained":
return seasonData[0].division;
case "Relegated":
return seasonData[0].division 1;
default:
console.log("result not one of the three values");
}
}
const eaMatches = [{"season": "1", "Score": "1-0"}, {"season": "1", "Score": "2-0"}, {"season": "2", "Score": "3-0"}]
let seasonOfLastGame = 1;
for (const match of eaMatches) {
if (seasonOfLastGame === season) {
division = 8;
} else {
division = await getDivisionBasedOnSeasonResult();
}
seasonOfLastGame = season;
const newMatch = new Match({
division,
});
newMatch.save()
.then(() => {
res.json('Match added!')
})
.catch(err => res.status(400).json('Error: ' err));
};
});
module.exports = router;
getSeasonData.js
const Match = require('../../models/match.model');
const getSeasonData = async seasonOfLastGame => {
const stages = [
{ "$match": { season: seasonOfLastGame } }
{
"$group":
{
"_id": "$season",
"points": {
"$sum": {
"$add": [{"$sum": { $cond: [{ $eq: ['$result', "Win"] }, 1, 0] } }]
}
},
"teamPlayed": { $sum: 1 }
}
},
{ "$sort": { "_id": 1 } },
{
"$project": {
"seasonResult":
{
$switch:
{
branches: [
{
case: {$gte: ["$points", 6] },
then: "Promoted"
},
{
case: {$gte: ["$points", 4] },
then: "Remained"
},
{
case: {$lt: ["$points", 4] },
then: "Relegated"
}
],
default: "Result not available"
}
}
},
}
]
return Match.aggregate(stages);
}
module.exports = getSeasonData;
Ответ №1:
Я исправил это, добавив это
const updatedMatches = await Match.find();
в инструкции else чуть выше
division = await getDivisionBasedOnSeasonResult();