mongodb - 如何从所有级别的父级获取子文档的一个字段和所有 _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" }
]
)
解决方案
您可以尝试以下聚合
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
}
]
推荐阅读
- excel - 比较字符串值VBA时,如果语句跳过正文
- html - 如何将结构化数据标记中的 markup.html 放置在 Wordpress 页面中
- python - 弹性搜索查询字符串的解析器
- php - Laravel 响应 404 文件未找到
- dart - Flutter:如何将文本字段上“粘贴”的工具提示名称更改为设备的语言
- react-native - 错误:连接错误:无法连接到节点 https://mainnet.infura.io/
- javascript - d3 使用 eslint 进行常规缩进
- prolog - Prolog添加功能
- c# - JSON 中的 C# Rest 响应反序列化为自定义对象
- angular - Angular 5:数据服务,加载初始值