Запрос Mongodb для подсчета различного значения во всех документах - PullRequest
2 голосов
/ 18 апреля 2020

Образцы документов:

{"id": "1",  "movie_data": "enemies": ["a", "b", "v-glaive", "t-midnight", "t-obsidian", "u-klaue"], "groups": ["avengers"], "movies": []}
{"id": "2",  "movie_data": "enemies": ["a", "d"], "groups": ["avengers"], "movies": []}
{"id": "3",  "movie_data": "enemies": ["a", "b", "c", "d"], "groups": ["avengers"], "movies": []}

Здесь мне нужна группа - Мститель и враг считаются как отдельные значения врагов во всех коллекциях.

Avenger - enemy count - 9

1 Ответ

0 голосов
/ 18 апреля 2020

Вы можете сделать это, используя конвейер агрегации MongoDB :

db.collection.aggregate([
   /** unwind creates multiple docs for each value in array */
  {
    $unwind: "$movie_data.groups"
  },
  /** Pick docs where we've groups as 'avengers' */
  {
    $match: {
      "movie_data.groups": "avengers"
    }
  },
  {
    $unwind: "$movie_data.enemies"
  },
  {
    $group: {
      _id: "$movie_data.groups",
      uniqueEmemies: {
        $addToSet: "$movie_data.enemies" /** Adds unique value to array */
      }
    }
  },
  {
    $project: {
      _id : 0,
      group: "$_id",
      uniqueEnemyCount: {
        $size: "$uniqueEmemies"
      }
    }
  }
])

Тест: mongoplayground

...