Mon go объединение запросов двух средних результатов на основе разных значений поля - PullRequest
0 голосов
/ 24 марта 2020

У меня есть следующая структура для моей коллекции player_statistics.

{
    "_id" : ObjectId("5e712989edbdba067fed5f2e"),
    "surname" : "player_A",
    "team" : "team_A",
    "position" : "forward",
    "minutes" : 46,
    "shots" : 2,
    "passes" : 16,
    "tackles" : 0,
    "saves" : 0
}

Свойство position имеет несколько значений, таких как forward, midfield et c. Мое требование состоит в том, чтобы получить средние проходы, основанные на позиции , используя один запрос .

db.player_statistics.aggregate([
    { $match: { position: 'forward'} },
         { $group: {"_id": null , pop :{$avg:'$passes'}} } 
  ]).pretty();

db.player_statistics.aggregate([
    { $match: { position: 'midfielder'} },
    { $group: {"_id": null , pop2 :{$avg:'$passes'}} } ,
  ]).pretty();

Я написал следующие два на основе агрегата mon go. Есть ли способ объединить два в одно, используя что-то похожее на UNION в MySQL. Или есть лучший способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

В этом случае все, что вам нужно сделать, это сгруппировать в поле position:

db.player_statistics.aggregate([
  {
    $group: {
      "_id": "$position",
      pop: {
        $avg: "$passes"
      }
    }
  },
  /** Optional - When you use '$avg' then result might not be integer can be a decimal to make it to int you can use round */
  {
    $addFields: {
      pop: {
        $round: "$pop"
      }
    }
  }
])

Тест: MongoDB-Playground

0 голосов
/ 25 марта 2020

С помощью @whoami я смог написать нужный запрос MongoDB.

db.player_statistics.aggregate([
   { $match : { $or : [{position:{$eq:'midfielder'}}, {position:{$eq:'forward'}}]}},
  {
    $group: {
      "_id": "$position",
      avg: {
        $avg: "$passes"
      }
    }
  }
])
...