Mongodb Aggregation Как я могу объединить этот вложенный документ вложенного документа? - PullRequest
0 голосов
/ 31 января 2020

Я хотел бы объединить эти данные, эти два данных имеют одинаковый root _id, а поле видео имеет одинаковое значение songs._id. Наконец, я хочу объединить эти видеоданные с одинаковыми song._id и массивом видео с одинаковыми данными песен и теми же root я имею в виду,

[
  {
    "_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
            }]
        }
    }

Как я могу это сделать? группа? проблема в том, что я не могу сделать группировку вложенного документа вложенного документа

1 Ответ

0 голосов
/ 31 января 2020

Вам нужно $group на songs._id (и root _id в вашем контексте) и накапливать субдокумент video во временном массиве video (мы храним внутри root документ верхнего уровня на следующем этапе).

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"
      }
    }
  }
])

MongoPlayground

...