MongoDB部分索引是否适配exists子句及相关查询能否命中该索引
MongoDB部分索引命中情况分析
你创建的部分索引过滤条件如下:
{ "$and" : [ { "field1" : { "$exists" : true } }, { "field2" : { "$exists" : true } } ] }
查询1:{ $and : [{ "field1" : { "$ne" : null } }, { "field2" : { "$ne" : null } }] }
- 无法命中该部分索引
- 原因:
$ne: null的匹配范围比$exists: true更广——它会匹配字段不存在的文档,以及字段存在但值不为null的文档。而你的部分索引仅包含field1和field2都存在的文档,这个查询的结果集里还包含不在索引范围内的字段不存在的文档。MongoDB无法仅通过该索引获取所有匹配结果,因此不会选择这个索引。
查询2:{$and : [{"field1" : {"$exists" : true}}, {"field2" : {"$exists" : true}}]}
- 可以命中该部分索引
- 原因:这个查询的条件和部分索引的过滤条件完全一致,所有匹配的文档都被包含在该部分索引中。MongoDB可以直接通过索引快速定位目标文档,因此会使用该部分索引。
内容的提问来源于stack exchange,提问作者Mayur
相关产品推荐
相关产品推荐

