Почему Mongoose всегда получает более старый снимок моей базы данных?

#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();