Вычислить сумму поля массива объектов - PullRequest
0 голосов
/ 08 мая 2020

Работа над приложением Node с Express в качестве веб-фреймворка и Mon go в качестве серверной части. В настоящее время у меня есть схема данных Mon goose с игроками и связанной статистикой. Вот анонимный пример структуры:

  name: 'Player Name',
  image: 'image-location',
  position: 'Guard',
  description: 'Player Detail',
  __v: 6,
  weight: 200,
  dob: 1993-08-03T05:00:00.000Z,
  hometown: 'town-name',
  country: 'country-name',
  height_feet: 6,
  height_inches: 4,
  season: [
    {
      year: '2012-2013',
      grade: 'Freshman',
      gp: 18,
      gs: 0,
      mpg: 6.9,
      fg: 0.348,
      tp: 0.278,
      ft: 1,
      rpg: 0.8,
      apg: 1,
      spg: 0.3,
      bpg: 0,
      ppg: 1.4
    },
    {
      year: '2013-2014',
      grade: 'Sophomore',
      gp: 36,
      gs: 7,
      mpg: 20.3,
      fg: 0.432,
      tp: 0.4,
      ft: 0.643,
      rpg: 1.6,
      apg: 1.1,
      spg: 0.2,
      bpg: 0.1,
      ppg: 7.1
    },
    {
      year: '2014-2015',
      grade: 'Junior',
      gp: 34,
      gs: 33,
      mpg: 27.5,
      fg: 0.449,
      tp: 0.391,
      ft: 0.755,
      rpg: 2.9,
      apg: 2,
      spg: 0.8,
      bpg: 0.1,
      ppg: 10.1
    },
    {
      year: '2015-2016',
      grade: 'R. Senior',
      gp: 8,
      gs: 8,
      mpg: 31.6,
      fg: 0.425,
      tp: 0.291,
      ft: 0.6,
      rpg: 2.9,
      apg: 1.9,
      spg: 0.6,
      bpg: 0.3,
      ppg: 12
    },
    {
      year: '2016-2017',
      grade: 'Senior',
      gp: 35,
      gs: 35,
      mpg: 33.3,
      fg: 0.473,
      tp: 0.384,
      ft: 0.795,
      rpg: 4.6,
      apg: 2.7,
      spg: 1.2,
      bpg: 0,
      ppg: 15.1
    }
  ]

}

Я все еще новичок в Mon go и Node в целом, так что простите за элементарный вопрос. Как я могу рассчитать среднее значение определенной статистики c для общего количества сезонов (например, среднее значение очков за игру за 4 года)?

Цель здесь состоит в том, чтобы вычислить значение и сделать его доступным и переданным по маршруту GET для страницы игрока. Вот маршрут, который у меня есть для страницы игрока:

router.get("/:id", function(req, res){
    Player.findById(req.params.id).populate("comments").exec(function(err, foundPlayer){
        if(err){
            console.log(err);
        } else {
            console.log(foundPlayer)
            res.render("players/show", {player: foundPlayer});
        }
    });
});

Что я могу сделать, чтобы вычислить это значение и сделать его доступным для использования на странице игрока?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

мы можем использовать агрегатный конвейер для вычисления среднего непосредственно в запросе

db.collection.aggregate([
  {
    $match: {
      _id: "playerId1" // this needs to be of type ObjectId, it should be something like mongoose.Types.ObjectId(req.params.id) in your case
    }
  },
  {
    $unwind: "$season" // unwind the season array to get a stream of documents, and to be able to calculate the average of ppg
  },
  {
    $group: { // then group them again
      _id: "$_id",
      averagePointsPerGame: {
        $avg: "$season.ppg"
      },
      season: {
        $push: "$season"
      }
    }
  }
])

вы можете проверить это здесь Пн go Площадка

надеюсь, что это поможет

1 голос
/ 08 мая 2020

Вам нужно перебрать массив сезонов и найти среднее значение. Например:

const { season } = <.........your MongoDB response>
let average = 0;
if(season.length){
    let total = 0
    season.map(({ gp }) => (total += gp))
    average = total / season.length
}

Среднее значение переменной даст вам ответ. Я показал пример для расчета среднего gp

...