मुझे संदेह है कि मुद्दा यह नहीं था कि एकत्रीकरण एक सूचकांक को तोड़ देगा, बल्कि इसके बजाय एकत्रीकरण ने अनुक्रमणिका का उपयोग नहीं किया और एक संग्रह स्कैन करेगा।
जब $ हों, तो एग्रीगेशन इंडेक्स का फायदा उठा सकता है मैच और/या $सॉर्ट चरण
एक पाइपलाइन की शुरुआत में रखा गया। यह एकत्रीकरण केवल एक $group
है चरण, जिसका अर्थ है कि गणना की गणना करने के लिए पूरे संग्रह को पुनरावृत्त करने की आवश्यकता होगी।
मैंने संग्रह स्कैन करते हुए एकत्रीकरण को दिखाते हुए एक सरल उदाहरण नीचे दिया है, तब भी जब सरणी फ़ील्ड अनुक्रमित होती है।
> db.foo.insert({ "x" : [ 1, 2 ] } )
> db.foo.insert({ "x" : [ 1 ] } )
> db.foo.createIndex({ "x" : 1 } )
...
> db.foo.aggregate([ { $group: { _id: null, cnt: { $sum : { $size: "$x" } } } } ] )
{ "_id" : null, "cnt" : 3 }
// Results of a .explain() - see 'winningPlan' below
> db.foo.explain(true).aggregate([ { $group: { _id: null, cnt: { $sum : { $size: "$x" } } } } ] )
{
"stages" : [
{
"$cursor" : {
"query" : {
},
"fields" : {
"x" : 1,
"_id" : 0
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "stack.foo",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 2,
"executionTimeMillis" : 0,
"totalKeysExamined" : 0,
"totalDocsExamined" : 2,
"executionStages" : {
"stage" : "COLLSCAN",
"nReturned" : 2,
"executionTimeMillisEstimate" : 0,
"works" : 4,
"advanced" : 2,
"needTime" : 1,
"needYield" : 0,
"saveState" : 1,
"restoreState" : 1,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 2
},
"allPlansExecution" : [ ]
}
}
},
{
"$group" : {
"_id" : {
"$const" : null
},
"cnt" : {
"$sum" : {
"$size" : [
"$x"
]
}
}
}
}
],
"ok" : 1,
...
}