我有这个json:
{
"_id": "id",
"field1": "value1",
"field2": "value2",
"field3": "value3",
"field4": "value4",
"field5": "value5",
"field6": [
{
"field7": "value_a7_level1",
"field8": "value_a8_level1",
"field9": "value_a9_level1",
"field10": [
{
"field11": "value_a11_level1",
"field12": "value_a12_level1",
"field13": "value_a13_level1",
"field14": "value_a14_level1"
},
{
"field11": "value_b11_level1",
"field12": "value_b12_level1",
"field13": "value_b13_level1",
"field14": "value_b14_level1"
}
],
"field15": [
{
"field16": "zzz",
"field17": "xxx",
"field18": "value_a18_level1",
"field19": "value_a19_level1"
},
{
"field16": "xxx",
"field17": "yyy",
"field18": "value_b18_level1",
"field19": "value_b19_level1"
},
{
"field16": "xxx",
"field17": "yyy",
"field18": "value_c18_level1",
"field19": "value_c19_level1"
}
]
},
{
"field7": "value_a7_level2",
"field8": "value_a8_level2",
"field9": "value_a9_level2",
"field10": [
{
"field11": "value_a11_level2",
"field12": "value_a12_level2",
"field13": "value_a13_level2",
"field14": "value_a14_level2"
},
{
"field11": "value_b11_level2",
"field12": "value_b12_level2",
"field13": "value_b13_level2",
"field14": "value_b14_level2"
}
],
"field15": [
{
"field16": "value_a16_level2",
"field17": "value_a17_level2",
"field18": "value_a18_level2",
"field19": "value_a19_level2"
},
{
"field16": "value_b16_level2",
"field17": "value_b17_level2",
"field18": "value_b18_level2",
"field19": "value_b19_level2"
},
{
"field16": "value_c16_level2",
"field17": "value_c17_level2",
"field18": "value_c18_level2",
"field19": "value_c19_level2"
}
]
},
{
"field7": "value_a7_level3",
"field8": "value_a8_level3",
"field9": "value_a9_level3",
"field10": [
{
"field11": "value_a11_level3",
"field12": "value_a12_level3",
"field13": "value_a13_level3",
"field14": "value_a14_level3"
},
{
"field11": "value_b11_level3",
"field12": "value_b12_level3",
"field13": "value_b13_level3",
"field14": "value_b14_level3"
}
],
"field15": [
{
"field16": "xxx",
"field17": "yyy",
"field18": "value_a18_level3",
"field19": "value_a19_level3"
},
{
"field16": "value_b16_level3",
"field17": "value_b17_level3",
"field18": "value_b18_level3",
"field19": "value_b19_level3"
},
{
"field16": "value_c16_level3",
"field17": "value_c17_level3",
"field18": "value_c18_level3",
"field19": "value_c19_level3"
}
]
}
],
"field20": [
{
"field21": "value21_level1",
"field22": "value22_level1",
"field23": "value23_level1"
},
{
"field21": "value21_level2",
"field22": "value22_level2",
"field23": "value23_level2"
}
]
}
我想根据过滤器和选择返回结果。过滤器将是例如:
field16 和 field17 必须分别等于“XXX”和“YYY”。
我需要返回一个包含所有字段的 json,但 field15 将只包含与过滤器对应的对象。此外,field6 将仅包含 chemp15 向过滤器返回 true 的对象。
在我的示例中,我将得到以下结果:
{
"_id": "id",
"field1": "value1",
"field2": "value2",
"field3": "value3",
"field4": "value4",
"field5": "value5",
"field6": [
{
"field7": "value_a7_level1",
"field8": "value_a8_level1",
"field9": "value_a9_level1",
"field10": [
{
"field11": "value_a11_level1",
"field12": "value_a12_level1",
"field13": "value_a13_level1",
"field14": "value_a14_level1"
},
{
"field11": "value_b11_level1",
"field12": "value_b12_level1",
"field13": "value_b13_level1",
"field14": "value_b14_level1"
}
],
"field15": [
{
"field16": "xxx",
"field17": "yyy",
"field18": "value_b18_level1",
"field19": "value_b19_level1"
},
{
"field16": "xxx",
"field17": "yyy",
"field18": "value_c18_level1",
"field19": "value_c19_level1"
}
]
},
{
"field7": "value_a7_level3",
"field8": "value_a8_level3",
"field9": "value_a9_level3",
"field10": [
{
"field11": "value_a11_level3",
"field12": "value_a12_level3",
"field13": "value_a13_level3",
"field14": "value_a14_level3"
},
{
"field11": "value_b11_level3",
"field12": "value_b12_level3",
"field13": "value_b13_level3",
"field14": "value_b14_level3"
}
],
"field15": [
{
"field16": "xxx",
"field17": "yyy",
"field18": "value_a18_level3",
"field19": "value_a19_level3"
}
]
}
],
"field20": [
{
"field21": "value21_level1",
"field22": "value22_level1",
"field23": "value23_level1"
},
{
"field21": "value21_level2",
"field22": "value22_level2",
"field23": "value23_level2"
}
]
}
我尝试了几种方法来获得这个结果,但徒劳无功。这是最后一个,但我一点也不满意,因为结果结构不合理:
db.requirements.aggregate([
{
$match: {
"field6": {
$elemMatch: {
"field15": {
$elemMatch: {
"field16": "xxx",
"field17": "yyy",
}
}
}
}
}
},
{
$addFields: {
"field6": {
$map: {
input: "$field6",
as: "f6",
in: {
$filter: {
input: "$$f6.field15",
as: "f15",
cond: {$and: [
{$eq: ["$$f15.f16", "xxx"]},
{$eq: ["$$f15.f17", "yyy"]}
]}
}
}
}
}
},
}
]);
我也尝试了 $unwind 和 $group 但它没有返回我想要的 json。
有人可以帮我找到解决方案吗?
预先感谢您的回答。