首页 > 解决方案 > 如何从所有级别的父级获取子文档的一个字段和所有 _id?

问题描述

我有以下文档结构:

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

标签: mongodbmongodb-queryaggregation-frameworkspring-data-mongodb

解决方案


您可以尝试以下聚合

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

推荐阅读