MongoDB如何筛选非空字段并仅返回目标字段内容?
解决方案:MongoDB仅返回存在指定嵌套字段的非空文档
你之前的核心问题是把$exists用在了投影参数里,而$exists是查询条件操作符,只能用来过滤文档,不能控制字段显示。要实现只返回包含有效adress.apartment字段的文档,需要同时完成「过滤符合条件的文档」和「投影指定字段」两步操作。
方法一:使用find完成过滤+投影
直接在find的第一个参数(查询条件)中添加字段存在性判断,第二个参数控制投影:
db.student.find( { "adress.apartment": { $exists: true } }, { _id: 0, "adress.apartment": 1 } )
执行后只会返回符合条件的文档:
{ "adress" : { "apartment" : 23 } }
方法二:使用聚合管道(支持更复杂逻辑)
如果需要额外排除adress为空对象、apartment为null的情况,用聚合管道更灵活:
db.student.aggregate([ // 过滤规则:adress是对象且非空,同时apartment存在且非空 { $match: { "adress": { $type: "object", $ne: {} }, "adress.apartment": { $exists: true, $ne: null } } }, // 投影只保留目标字段 { $project: { _id: 0, "adress.apartment": 1 } } ])
为什么之前的写法无效?
db.student.find({},{_id:0,adress:{apartment:{$exists:true}}}):投影参数不支持$exists,MongoDB会忽略这个无效规则,导致返回所有文档,无匹配字段的文档就显示为空。db.student.find({},{_id:0,adress:{$exists:true}}):同样错误地在投影中使用$exists,无法起到过滤文档的作用。
内容的提问来源于stack exchange,提问作者joby george
相关产品推荐
相关产品推荐

