MongoDB中针对索引字段使用$exists: false的查询能否利用索引?
MongoDB中针对索引字段使用$exists: false的查询能否利用索引?
嘿,这个问题问到点子上了,我来给你讲明白实际情况~
首先结论先行:如果你的索引是普通的非稀疏单字段索引,那这个$exists: false的查询是完全可以利用索引的,不会触发全集合扫描。
为啥呢?因为MongoDB的普通单字段索引,只会把包含该字段的文档加入索引条目里。当你查询{ myField: { $exists: false } }时,查询优化器会反过来利用这个特性:它会先通过索引快速统计出有多少文档包含myField,然后直接定位到那些不在索引里的文档——这可比全表扫一遍要高效多了。
你可以自己验证一下,给你的聚合管道加上explain("executionStats")来确认,比如执行这段命令:
db.collection.aggregate([ { $match: { myField: { $exists: false } } } ], { explain: "executionStats" })
看返回结果里的executionStats.totalDocsExamined,如果它远小于集合的总文档数,同时executionStats.indexKeysExamined等于索引里的条目数,就说明查询确实用到了索引。
不过这里有个例外情况:如果你的索引是稀疏索引(创建时指定了sparse: true),那这个查询就没法利用索引了。因为稀疏索引本身就不包含没有myField的文档,查询优化器没法通过它找到目标文档,只能老老实实走全集合扫描。
另外要注意,聚合管道里的$match阶段支持查询下推,所以它的索引利用逻辑和普通的find查询完全一致,不用额外担心聚合阶段会影响索引的使用。
内容来源于stack exchange
相关产品推荐
相关产品推荐

