Вложенный вывод по группе в mongoDB

У меня есть такая коллекция.

let Movies= [
{year: '2000', language: 'English', genre: 'Romance' , name: 'A beautiful day'},
{year: '2000', language: 'English', genre: 'Action' , name: 'A Dangerous day'},
{year: '2000', language: 'French', genre: 'Romance' , name: 'someromancename'},
{year: '2000', language: 'French', genre: 'Action' , name: 'someactionname'},]

Мне нужно получить вывод в групповом формате, который может выглядеть примерно так:

{
"2000" : {
            "English": {
                        "Romance": [{
                                    "name":"A beautiful day"
                                     //other fields
                                    }]
                        "Action": [{
                                    "name":"A dangerous day"
                                    }]
                        },
            "French": {
                        "Romance": [{
                                    "name":"Some Romance Name"
                                    }]
                        "Action": [{
                                    "name":"Some Action Name"
                                    }]
                        },
        }

}

Я пытался использовать агрегацию, но не смог получить точный запрос, так как я новичок в MongoDB. Это то, что я пытался сделать, но ожидаемый результат не был достигнут.

db.getCollection('Movies').aggregate([
{$group: {_id: {"year" : "$year",
            "language": "$language" , 
            "genre": "$genre" , 
            
            },
       "movies": {"$push": "$$ROOT"}
      } 
  },
  {$group: {_id: "$_id.year",
            "movies": {"$push": {
                "language": "$_id.language",
                "genre": "$_id.genre" , 
                "movies": "$movies"
                }}     
  }
  },

  ])
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Можешь попробовать,

  • $group на year, language and genre и создайте массив названий фильмов в movies
  • $group по year and language и сделать массив с жанром в формате k и v
  • $group на year и создайте массив языка после преобразования вышеуказанного массива жанров в объект с помощью $arrayToObject
  • преобразовать массив языка в объект, используя $arrayToObject, преобразовать год с помощью объекта languages в объект, используя $arrayToObject, и заменить этот объект на корень, используя $replaceRoot
db.getCollection('Movies').aggregate([
  {
    $group: {
      _id: {
        "year": "$year",
        "language": "$language",
        "genre": "$genre"
      },
      "movies": { "$push": { name: "$name" } }
    }
  },
  {
    $group: {
      _id: {
        year: "$_id.year",
        language: "$_id.language"
      },
      "movies": {
        "$push": {
          k: "$_id.genre",
          v: "$movies"
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.year",
      movies: {
        $push: {
          k: "$_id.language",
          v: { $arrayToObject: "$movies" }
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [[
            {
              k: "$_id",
              v: { $arrayToObject: "$movies" }
            }
        ]]
      }
    }
  }
])

Детская площадка

Другие вопросы по теме