Как я могу поместить массив в агрегатный конвейер и поднять его на один уровень вверх? - PullRequest
0 голосов
/ 17 мая 2018

Я новичок в MongoDB и занимаюсь разработкой программного обеспечения на C # и MongoDB.Моя структура данных выглядит так:

{
  "Id": 1,
  "Title": "myTitle",
  "Geners": [ "Drama", "Action" ],
  "Category": 1,
  "Casts": [
    {
      "Id": 1,
      "Name": "myName",
      "Gender": "Male",
      "Age": 35
    },
    {
      "Id": 2,
      "Name": "herName",
      "Gender": "Female",
      "Age": 30
    },
    {
      "Id": 3,
      "Name": "hisName",
      "Gender": "Male",
      "Age": 45
    }
  ]
}

Это всего лишь один документ, и у меня около 5 миллионов документов.Я хочу выполнить запрос, подобный приведенному ниже, чтобы посчитать записи, основанные на Category, и показать, сколько фильмов у меня есть в каждой категории, и я хочу добавить в поле значение «Кастинги».

db.getCollection('myCollection').aggregate([
    {
    $group:{"_id":"$Category", "count": {$sum:1},
    "Casts":{$push:"$Casts"}} 
    }
])

этоблизко к чему-то, что я хочу, но проблема в том, что Casts данные помещаются во второй уровень массива, например {"Id":1, ... , "Casts":[[{},{},...]]}, но мне нужно вот так {"Id":1, ... , "Casts":[{},{},...]} Как я могу показать такие данные?

1 Ответ

0 голосов
/ 17 мая 2018

Если допустимы дубликаты, то будет достаточно следующей агрегации:

db.getCollection('myCollection').aggregate([
    { $unwind:"$Casts"},
    {
    $group:{"_id":"$Category", "count": {$sum:1},
    "Casts":{$push:"$Casts"}} 
    }
])

Обновление: поскольку вам необходимо, чтобы счетчик был действительным, есть еще несколько скачков, через которые нужно перейти.

db.getCollection('myCollection').aggregate([
    { $group:{"_id":"$Category", "count": {$sum:1}, "Casts":{$addToSet:"$Casts"}}},
    {$unwind:"$Casts"},
    {$unwind:"$Casts"},
    { $group:{"_id":"$_id", "count": {$first:"$count"}, "Casts":{$addToSet:"$Casts"}}},
])

Дайте мне знать, если это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...