我要查询的集合包含具有以下结构的文档-
{
"_id": 1,
"topA": "topAValue",
"topB": "topBValue",
"topC": "topCValue",
"nestedDocArray": [
{
"attr1": "a",
"attr2": "b",
"attr3": "c",
"subnestedDocArray": [
{
"subAttr1": "asub1",
"subAttr2": "bsub1",
"subAttr3": "csub1"
},
{
"subAttr1": "asub2",
"subAttr2": "bsub2",
"subAttr3": "csub2"
},
{
"subAttr1": "asub3",
"subAttr2": "bsub3",
"subAttr3": "csub3"
}
]
},
{
"attr1": "a5",
"attr2": "b5",
"attr3": "c5",
"subnestedDocArray": [
{
"subAttr1": "a5sub1",
"subAttr2": "b5sub1",
"subAttr3": "c5sub1"
},
{
"subAttr1": "a5sub2",
"subAttr2": "b5sub2",
"subAttr3": "c5sub2"
},
{
"subAttr1": "a5sub3",
"subAttr2": "b5sub3",
"subAttr3": "c5sub3"
}
]
},
{
"attr1": "a1000",
"attr2": "b1000",
"attr3": "c1000",
"subnestedDocArray": [
{
"subAttr1": "a1000sub1",
"subAttr2": "b1000sub1",
"subAttr3": "c1000sub1"
},
{
"subAttr1": "a1000sub2",
"subAttr2": "b1000sub2",
"subAttr3": "c5sub2"
},
{
"subAttr1": "a1000sub3",
"subAttr2": "b1000sub3",
"subAttr3": "c1000sub3"
}
]
}
]
}
我的要求是投影topA,topB,topC值以及nestedDocArray.attr2和nestedDocArray.subnestedDocArray.subAttr2。我将选择文档的第一个查询将是“ _id”:1.我需要nestedDocArray中的元素,其nestedDocArray.attr1 =“ a5”。此外,我需要使用[“ a5sub1”,“ a5sub2”]中的nestedDocArray.subnestedDocArray.subAttr1来过滤subnestedDocArray中的元素。
到目前为止,我有以下查询-
db.testCollection.aggregate(
[
{
"$match": {
"_id": 1
}
},
{
"$unwind": "$nestedDocArray"
},
{
"$match": {
"$nestedDocArray.attr1": {
"$eq": "a5"
}
}
},
{
"$unwind": "$nestedDocArray.subnestedDocArray"
},
{
"$match": {
"$nestedDocArray.subnestedDocArray.attr1": {
"$in": ["a5sub1", "a5sub2"]
}
}
}
]
);
这将导致以下结果-
[
{
"_id": 1,
"topA": "topAValue",
"topB": "topBValue",
"topC": "topCValue",
"nestedDocArray": {
"attr1": "a5",
"attr2": "b5",
"attr3": "c5",
"subnestedDocArray": {
"subAttr1": "a5sub1",
"subAttr2": "b5sub1",
"subAttr3": "c5sub1"
}
}
},
{
"_id": 1,
"topA": "topAValue",
"topB": "topBValue",
"topC": "topCValue",
"nestedDocArray": {
"attr1": "a5",
"attr2": "b5",
"attr3": "c5",
"subnestedDocArray": {
"subAttr1": "a5sub2",
"subAttr2": "b5sub2",
"subAttr3": "c5sub2"
}
}
}
]
可以在聚合管道的最末端添加必要属性的投影。 但是,$ unwind已完全破坏了文档的结构。是否可以对展开的属性进行风/分组?我正在寻找保留集合原始文档结构的输出。
我正在寻找的输出如下-
{
"_id": 1,
"topA": "topAValue",
"topB": "topBValue",
"topC": "topCValue",
"nestedDocArray": [
{
"attr2": "b5",
"subnestedDocArray": [
{
"subAttr2": "b5sub1"
},
{
"subAttr2": "b5sub2"
}
]
}
]
}