MongoDB使用$exists和$and仍返回无指定字段文档的问题排查
问题排查与解决方案
嘿,我一眼就揪出问题所在了——你把MongoDB find() 方法的参数用混了!这是个很容易踩的新手坑,咱们一步步理清楚:
核心问题:参数位置完全搞错了
db.collection.find() 的两个参数分工是固定的:
- 第一个参数是查询过滤器:用来指定哪些文档符合查询要求
- 第二个参数是投影器:只能用来控制返回结果包含/排除哪些字段,绝对不能放查询条件!
你现在的写法里,把本该属于查询过滤器的$and条件放到了投影参数的位置,MongoDB会直接忽略这个无效的投影配置。相当于你实际只执行了db.QA_Book_01.find({ field00048: { $exists: true }}).count()——但你说连不含该字段的条目都被返回了?那大概率还有两种小问题:
- 是不是拼写错了字段名?MongoDB对字段名大小写敏感,比如
Field00048和field00048是完全不同的字段 - 有没有文档里的
field00048字段存在但值为null?$exists: true会包含这类文档,但如果你确认只有1条有这个字段,那核心问题还是参数位置错误
正确的查询写法
把所有查询条件合并到第一个参数里就行,MongoDB默认会用逻辑与($and)连接多个条件,两种写法都可以:
简化版(推荐)
db.QA_Book_01.find({ field00048: { $exists: true, $ne: 'Closed' }, entryTypeId: 'Entry_Type_01' }).count()
显式用$and的版本(逻辑更清晰)
db.QA_Book_01.find({ $and: [ { field00048: { $exists: true } }, { entryTypeId: 'Entry_Type_01' }, { field00048: { $ne: 'Closed' } } ] }).count()
额外排查小技巧
- 先单独执行
db.QA_Book_01.find({ field00048: { $exists: true }}),看看返回的是不是只有那1条包含该字段的文档,确认字段名和存在性没问题 - 检查
entryTypeId字段的拼写和值的大小写,比如是不是把Entry_Type_01写成了entry_type_01 - 如果还是有问题,执行
db.QA_Book_01.find().pretty()查看所有文档的结构,确认字段存在情况和值的类型
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

