MongoDB聚合查询:如何提取对象列表中的指定字段?
解决方案
你可以通过在$arrayElemAt获取目标数组元素后,直接提取嵌套字段的方式实现需求,同时建议合并两个$match阶段以提升查询效率。
优化后的聚合查询(方式一)
db.Collection_Name.aggregate([ { $match: { "Field1": "FilterValue1", "Field2": "FilterValue2" } }, { $project: { "Field1": 1, "SubFieldB2": { $arrayElemAt: ["$Field5.SubFieldB2", 1] } } } ])
优化后的聚合查询(方式二,更直观)
db.Collection_Name.aggregate([ { $match: { "Field1": "FilterValue1", "Field2": "FilterValue2" } }, { $project: { "Field1": 1, "SubFieldB2": { $getField: { field: "SubFieldB2", input: { $arrayElemAt: ["$Field5", 1] } } } } } ])
关键说明
- 合并
$match阶段:将两个$match合并为一个,MongoDB会在聚合管道早期过滤不符合条件的文档,减少后续阶段处理的数据量,提升查询性能。 - 字段提取逻辑:
- 方式一中,
"$Field5.SubFieldB2"会先提取数组每个元素的SubFieldB2值形成新数组,再通过$arrayElemAt取索引1的元素(即第二个元素的目标字段值)。 - 方式二中,先通过
$arrayElemAt获取数组的第二个完整元素,再用$getField提取其中的SubFieldB2字段,这种写法更直观,适合字段名包含特殊字符的场景。
- 方式一中,
内容的提问来源于stack exchange,提问作者Kaushik Mahadevan
相关产品推荐
相关产品推荐

