使用mongo 3.2。
试图找到信息,mongodb是否汇总了稀疏索引。
当放置在管道的开头时,$ match操作使用合适的索引来仅扫描集合中的匹配文档。
即使排序是由索引字段进行的,MongoDB也不会选择稀疏索引来完成查询以返回完整的结果:...要使用稀疏索引,请使用hint()显式指定索引
所以,问题是,如果我有稀疏索引,那么mongo聚合管道会在索引字段上匹配吗?或者不是?
答案 0 :(得分:2)
是的,MongoDB聚合将使用合适的稀疏索引,除非稀疏索引会返回某个查询的不完整结果。
问题中的摘录2解释了稀疏索引返回某个查询的不完整结果的示例。如果查询排序在稀疏字段上,但不对其进行过滤,则无法使用该索引,因为结果将不完整(文档缺少该字段)会被错误地排除在外。)
无法使用稀疏索引的另一种情况是您在字段上进行过滤但使用{ x: { $exists: false } }
之类的查询,其中稀疏索引不包含匹配结果(因为它明确排除了它们)。
如你所说,$match
正在使用稀疏索引对字段进行过滤,可以使用稀疏索引如果索引将包含完整结果,例如您正在检查相等或使用$gte
等比较运算符,但不是$ne
或{ $exists: false }
等运算符。
即使没有executionStats
,您也可以使用explain命令进行确认。
从包含{$match:{a:4}}
和未编制索引的字段a
的测试聚合查询中,执行集合扫描:
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"a" : {
"$eq" : 4
}
},
"direction" : "forward"
},
使用带有稀疏索引字段{$match:{b:4}}
的{{1}}的测试聚合查询,使用稀疏索引:
b
对于在稀疏索引字段"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"b" : 1
},
"indexName" : "b_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : true,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"b" : [
"[4.0, 4.0]"
]
}
}
},
上使用{$match:{b:{$exists:false}}
的测试聚合查询(这将返回b
上的稀疏索引的不完整结果),将执行集合扫描:
b