我在 MongoDB 中有以下文档 [更新:缩短了文档]
{
"sections": [
{
"_id": {
"$oid": "64cbeb62b669cd29a5719a8f"
},
"categories": [
{
"measureValues": [
"64cbeb62b669cd29a5719a95",
"64cbeb62b669cd29a5719a99"
]
}
]
}
],
"measures": [
{
"_id": {
"$oid": "64cbeb62b669cd29a5719a93"
},
"name": {
"64cbeb62b669cd29a5719a92": {
"nodeType": "nodeName",
"value": "measure-1"
}
},
"measureValues": [
{
"_id": {
"$oid": "64cbeb62b669cd29a5719a95"
},
"measureValues": {
"nodeName": {
"64cbeb62b669cd29a5719a94": {
"nodeType": "nodeName",
"value": "measureValue",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
},
"comment": {
"64cbeb62b669cd29a5719a97": {
"nodeType": "comment",
"value": "this is a comment",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
}
},
"categoriesIds": [
"64cbeb62b669cd29a5719a91"
],
"measureName": "measure-1"
},
{
"_id": {
"$oid": "64cbeb62b669cd29a5719a99"
},
"measureValues": {
"nodeName": {
"64cbeb62b669cd29a5719a98": {
"nodeType": "nodeName",
"value": "measureValue",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
},
"date": {
"64cbeb62b669cd29a5719a9b": {
"nodeType": "date",
"value": "2023-02-02",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
}
},
"categoriesIds": [
"64cbeb62b669cd29a5719a91"
],
"measureName": "measure-1"
}
]
}
],
"_class": "com.myapp.cqrsdemo.model.ProjectGroup"
}
我想获取“measures”下的“measureValues”,其中“measureValues”的 id 与类别下的measureValues 的 id 匹配。我想在类别下包含measureValue 对象,而不仅仅是Id。
我怎样才能做到这一点?我尝试编写聚合管道,但失败了。
我的输出应如下所示。
{
"sections": [
{
"_id": {
"$oid": "64cbeb62b669cd29a5719a8f"
},
"categories": [
{
"measureValues": [
{
"_id": {
"$oid": "64cbeb62b669cd29a5719a95"
},
"measureValues": {
"nodeName": {
"64cbeb62b669cd29a5719a94": {
"nodeType": "nodeName",
"value": "measureValue",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
},
"comment": {
"64cbeb62b669cd29a5719a97": {
"nodeType": "comment",
"value": "this is a comment",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
}
},
"categoriesIds": [
"64cbeb62b669cd29a5719a91"
],
"measureName": "measure-1"
},
{
"_id": {
"$oid": "64cbeb62b669cd29a5719a99"
},
"measureValues": {
"nodeName": {
"64cbeb62b669cd29a5719a98": {
"nodeType": "nodeName",
"value": "measureValue",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
},
"date": {
"64cbeb62b669cd29a5719a9b": {
"nodeType": "date",
"value": "2023-02-02",
"_class": "com.myapp.cqrsdemo.model.DataObj"
}
}
},
"categoriesIds": [
"64cbeb62b669cd29a5719a91"
],
"measureName": "measure-1"
}
]
}
]
}
],
"_class": "com.myapp.cqrsdemo.model.ProjectGroup"
}
一个选项是:
measureValuesArr
并在其中存储所有 measureValues
下所有
measures
sections.categories.measureValues
是一个双重嵌套数组(在数组上的数组内部),因此使用 double $map
来进入它的所有实例。$arrayElemAt
和 $indexOfArray
来查找 measureValues
内匹配的
measureValuesArr
db.collection.aggregate([
{$set: {
sections: {$let: {
vars: {measureValuesArr: {$reduce: {
input: "$measures",
initialValue: [],
in: {$concatArrays: ["$$value", "$$this.measureValues"]}
}}},
in: {$map: {
input: "$sections",
as: "s",
in: {$mergeObjects: [
"$$s",
{categories: {$map: {
input: "$$s.categories",
as: "c",
in: {$mergeObjects: [
"$$c",
{measureValues: {$map: {
input: "$$c.measureValues",
as: "m",
in: {$arrayElemAt: [
"$$measureValuesArr",
{$indexOfArray: [
"$$measureValuesArr._id",
{$toObjectId: "$$m"}
]}
]}
}}}
]}
}}}
]}
}}
}}
}}
])
查看它在 playground 示例中的工作原理