首页 > 解决方案 > Mongodb聚合如何合并这个子文档的子文档?

问题描述

我想结合这些数据,这两个数据具有相同的根_id,并且视频字段具有相同的songs._id 值。最后,我想将具有相同 song._id 的视频数据合并到相同歌曲数据和相同根目录下的视频数组,我的意思是,

[
  {
    "_id": ObjectId("5e328f15b7e4937f52c67679"),
    "name": "HoYoung",
    "like": 0,
    "view": 0,
    "songs": {
      "_id": "32f3156c-ed37-40dc-af96-dcbf53a84a58",
      "name": "testName",
      "lyrics": "testLyrics",
      "like": 0,
      "video": {
        "_id": "1255c77b-f3f6-466a-bd1a-0124555e5592",
        "like": 0,
        "view": 0
      }
    }
  },
  {
    "_id": ObjectId("5e328f15b7e4937f52c67679"),
    "name": "HoYoung",        
    "like": 0,
    "view": 0,        
    "songs": {
      "_id": "32f3156c-ed37-40dc-af96-dcbf53a84a58",
      "lyrics": "testLyrics",
      "like": 0,
      "name": "testName",
      "video": {
        "_id": "f08a433a-e120-459f-8bf1-1f55081dbf82",
        "like": 0,
        "view": 0
      }
    }
  }
]

   {
        "_id" : ObjectId("5e328f15b7e4937f52c67679"),
        "name" : "HoYoung",
        "like" : 0
        "songs" : {
            "_id" : "32f3156c-ed37-40dc-af96-dcbf53a84a58",
            "name" : "testName",
            "lyrics" : "testLyrics",
            "like" : 0,
            "view" : 0,
            "video" : [{
                "_id" : "1255c77b-f3f6-466a-bd1a-0124555e5592",
                "like" : 0,
                "view" : 0
            },{
                "_id" : "f08a433a-e120-459f-8bf1-1f55081dbf82",
                "like" : 0,
                "view" : 0
            }]
        }
    }

我怎样才能做到这一点?团体?问题是我不能对子文档的子文档进行分组

标签: databasemongodbnosqlaggregation-framework

解决方案


您需要$group通过songs._id(并在您的上下文中根)并在时间数组_id中累积video子文档(我们存储在顶级文档中以在下一阶段合并)。videoroot

db.collection.aggregate([
  {
    $group: {
      _id: "$songs._id",
      root: {
        $first: "$$ROOT"
      },
      video: {
        $push: "$songs.video"
      }
    }
  },
  {
    $project: {
      name: "$root.name",
      like: "$root.like",
      songs: {
        _id: "$root.songs._id",
        name: "$root.songs.name",
        lyrics: "$root.songs.lyrics",
        like: "$root.songs.like",
        view: "$root.songs.view",
        video: "$video"
      }
    }
  }
])

Mongo游乐场


推荐阅读