我在MongoDB中有以下文档[更新:缩短了文档]。
我想提取“measures”下的“measureValues”,其中“measureValues”的id与categories下的measureValues的id匹配。我希望在categories下包含measureValue对象,而不仅仅是Ids。
我该如何做到这一点?我尝试编写聚合管道,但失败了。
我的输出应该如下所示。
{
"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与categories下的measureValues的id匹配。我希望在categories下包含measureValue对象,而不仅仅是Ids。
我该如何做到这一点?我尝试编写聚合管道,但失败了。
我的输出应该如下所示。
{
"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"
}
64cbeb62b669cd29a5719a9b
)通常是一个糟糕的设计,它会让你的生活变得更加困难。而且看起来你混合了ObjectId
($oid
)和字符串值,这也不是很明智的做法。 - Wernfried Domscheitdb.collection.aggregate([{ $project: { _class: 1, sections: { categories: { $first: "$measures.measureValues" } } } }])
即可。但是你缺少一些信息:哪个数组可以为空?数组元素是否总是唯一的?还不清楚哪些元素被定义为数组,尽管它们始终只有一个元素(因此最好不要将其存储为数组)。 - Wernfried Domscheit