mongodb聚合是否使用稀疏索引

时间:2016-10-05 13:23:32

标签: mongodb indexing aggregation-framework

使用mongo 3.2。

试图找到信息,mongodb是否汇总了稀疏索引。

  1. https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/
      

    当放置在管道的开头时,$ match操作使用合适的索引来仅扫描集合中的匹配文档。

  2. https://docs.mongodb.com/manual/core/index-sparse/
      

    即使排序是由索引字段进行的,MongoDB也不会选择稀疏索引来完成查询以返回完整的结果:...要使用稀疏索引,请使用hint()显式指定索引

  3. 所以,问题是,如果我有稀疏索引,那么mongo聚合管道会在索引字段上匹配吗?或者不是?

1 个答案:

答案 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