繁体   English   中英

MongoDB 聚合中的多个嵌套分组

[英]Multiple nested grouping in MongoDB Aggregation

我的 mongoDB 集合中有上千个文档,其中每个文档代表这样一首歌曲的数据:

{
  "_id": ObjectID("612e03a790c3d3189845589b"),
  "artist": "3 Doors Down",
  "title": "Landning in London",
  "album": "Another 700 Miles",
  "genre": "Seventeen Days",
  "trackNumber": 5,
  "year": 2005,
  "rating": 3,
  "duration": "4:32",
  "country": "United States",
}

现在在聚合管道的帮助下,我想按以下方式对我的 collections 进行分组。 到目前为止,我可以为 1 个阶段进行分组,但我很难将完整的根文档推到最后并进行嵌套分组。

列出所有类型 --> 列出该类型中的所有艺术家 --> 列出该类型中该艺术家的所有专辑 --> 列出该专辑所有歌曲的 COMPLETE 根文档:

{
  [
    {
      "genreName": "Alternative Rock",
      "artists": [
        {
          "artistName": "3 Doors Down",
          "albums": [
            {
              "albumName": "Seventeen Days",
              "songs": [
                {
                  "_id": ObjectID(612e03a790c3d3189845589b),
                  "artist": "3 Doors Down",
                  "title": "Landning in London",
                  "album": "Another 700 Miles",
                  "genre": "Seventeen Days",
                  "trackNumber": 5,
                  "year": 2005,
                  "rating": 3,
                  "duration": "4:32",
                  "country": "United States",
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

这个应该工作:

db.collection.aggregate([
   {
      $group: {
         _id: { genreName: "$genre", artistName: "$artist", albumName: "$album" },
         songs: { $push: "$$ROOT" }
      }
   },
   {
      $group: {
         _id: { genreName: "$_id.genreName", artistName: "$_id.artistName" },
         albums: { $push: { albumName: "$_id.albumName", songs: "$songs" } }
      }
   },
   {
      $group: {
         _id: "$_id.genreName",
         artists: { $push: { artistsName: "$_id.artistsName", albums: "$albums" } }
      }
   },
   { $project: { _id: 0, genreName: "$_id", artists: 1 } }
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM