簡體   English   中英

mongodb聚合是否使用稀疏索引

[英]Does mongodb aggregation use sparse indexes

使用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也不會選擇稀疏索引來完成查詢以返回完整的結果:...要使用稀疏索引,請使用提示()顯式指定索引

所以,問題是,如果我有稀疏索引,mongo聚合管道與索引字段匹配我們,或不?

是的,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"
},

從具有稀疏索引字段b {$match:{b:4}}的測試聚合查詢中,使用稀疏索引:

"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]"
          ]
      }
  }
},

對於在稀疏索引字段b上使用{$match:{b:{$exists:false}}的測試聚合查詢(這將返回b上具有稀疏索引的不完整結果),執行集合掃描:

"winningPlan" : {
    "stage" : "COLLSCAN",
    "filter" : {
        "$not" : {
            "b" : {
                "$exists" : true
            }
        }
    },
    "direction" : "forward"
},

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM