如何从所有级别的父文档中获取子文档的一个字段和所有_id?

How can I get one field of subdocument and all _id from its parents accross all levels?

我有以下文档结构:

{
    clientId: 1001
    buildings: [
        _id: campus1
        rooms: [
            {
                _id: 2001
                name: conference
            },
            {
                _id: 2002
                name: meeting
            },
        ]
    ]
}

我想获得所有房间 ID 及其父 ID 的扁平化版本:

{
    roomId: 2001
    buildingId: campus1
},
{
    roomId: 2001
    clientId: 1001
},
{
    roomId: 2002
    buildingId: campus1
},
{
    roomId: 2002
    clientId: 1001
}

这将从房间 ID 开始,向上一层打印房间 ID 和建筑物 ID。之后再次从房间 ID 开始,但这次上升 2 层并打印房间 ID 和客户 ID。

有办法实现吗?

到目前为止,我没有得到想要的结果:

db.collection.aggregate(
[
      { $unwind:"$buildings" },
      { $unwind:"$building.rooms" },
    {
        $project: {
            _id: 0,
            client: "$_id",
            building: "$buildings._id",
            room: "$buildings.floors.rooms._id",
        }
    },
    { $unwind:"$room" }
]
)

您可以尝试以下聚合

db.collection.aggregate([
  { "$unwind": "$buildings" },
  { "$unwind": "$buildings.rooms" },
  { "$group": {
    "_id": null,
    "firstArray": {
      "$push": {
        "roomId": "$buildings.rooms._id",
        "buildingId": "$buildings._id"
      }
    },
    "secondArray": {
      "$push": {
        "roomId": "$buildings.rooms._id",
        "clientId": "$clientId"
      }
    }
  }},
  { "$project": {
    "data": {
      "$concatArrays": ["$firstArray", "$secondArray"]
    }
  }},
  { "$unwind": "$data" },
  { "$replaceRoot": { "newRoot": "$data" }}
])

或者这个

db.collection.aggregate([
  { "$facet": {
    "firstArray": [
      { "$unwind": "$buildings" },
      { "$unwind": "$buildings.rooms" },
      { "$project": {
        "roomId": "$buildings.rooms._id",
        "buildingId": "$buildings._id",
        "_id": 0
      }}
    ],
    "secondArray": [
      { "$unwind": "$buildings" },
      { "$unwind": "$buildings.rooms" },
      { "$project": {
        "roomId": "$buildings.rooms._id",
        "clientId": "$clientId",
        "_id": 0
      }}
    ]
  }},
  { "$project": {
    "data": {
      "$concatArrays": ["$firstArray", "$secondArray"]
    }
  }},
  { "$unwind": "$data" },
  { "$replaceRoot": { "newRoot": "$data" }}
])

两者都会给出相同的输出

[
  {
    "buildingId": "campus1",
    "roomId": 2001
  },
  {
    "buildingId": "campus1",
    "roomId": 2002
  },
  {
    "clientId": 1001,
    "roomId": 2001
  },
  {
    "clientId": 1001,
    "roomId": 2002
  }
]