[英]Does mongodb aggregation use sparse indexes
使用mongo 3.2。
試圖找到信息,mongodb聚合我們的稀疏索引。
放置在管道的開頭時,$ match操作使用合適的索引來僅掃描集合中的匹配文檔。
即使排序是通過索引字段進行的,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.