MongoDB查询如何返回完整指定字段并排除内部特定子字段
MongoDB 嵌套字段排除查询实现方案
MongoDB 原生支持「返回完整父级字段、仅排除指定嵌套子字段」的查询需求,根据部署版本选择对应写法即可。
方法1:普通find投影写法(MongoDB 4.4及以上版本推荐)
4.4版本开始MongoDB投影支持嵌套路径的排除规则,无需枚举所有需要保留的字段,直接指定要排除的嵌套字段路径即可:
// 替换为你的集合名,第一个参数为查询过滤条件 db.exampleCollection.find( {}, { "Example.field2": 0, // 仅排除Example下的field2,其余字段默认保留 // "_id": 0 // 不需要返回_id时添加该行 } )
针对你给出的示例文档,查询返回结果如下:
{ "_id": ObjectId("x8234728x8z8381"), "Example": { "field1": "first", "field3": { "field 3.1": "third" } } }
注意:该写法不要显式将
Example设为1,直接写嵌套排除规则即可,MongoDB会自动保留Example下所有未被标记排除的内容。
方法2:聚合管道写法(全版本兼容,支持4.4以下版本)
如果你的MongoDB版本低于4.4,使用聚合管道的$unset阶段可以实现完全一致的效果,同样不需要枚举保留字段:
db.exampleCollection.aggregate([ // 匹配阶段对应find的查询过滤条件,按需添加 // { $match: {} }, { $unset: "Example.field2" } ])
相关使用提示
- 如果需要同时排除多个嵌套子字段,直接给
$unset传字段路径数组即可,例如要同时排除field2和field3下的field 3.1,写为{ $unset: ["Example.field2", "Example.field3.field 3.1"] } - 4.4以下版本的find投影不支持「父字段保留+子字段排除」的混合写法,直接写会报投影冲突错误,这种场景直接用聚合的
$unset即可 - 嵌套字段路径必须用点号分隔,即使字段名包含空格,直接写在路径里即可,不需要额外转义

内容的提问来源于stack exchange,提问作者Victor Resende
相关产品推荐
相关产品推荐

