MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

(Wie) kann Aggregat() einen Index brechen?

Ich vermute, dass das Problem nicht darin bestand, dass die Aggregation einen Index beschädigte, sondern dass die Aggregation keine Indizes verwendete und einen Sammlungsscan durchführte.

Aggregationen können Indizes nutzen, wenn $ vorhanden sind Match- und/oder $sort-Stufen am Anfang einer Rohrleitung platziert. Diese Aggregation ist nur eine einzelne $group Phase, was bedeutet, dass die gesamte Sammlung durchlaufen werden müsste, um die Anzahl zu berechnen.

Ich habe unten ein einfaches Beispiel eingefügt, das die Aggregation zeigt, die einen Sammlungsscan durchführt, selbst wenn das Array-Feld indiziert ist.

> 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,
    ...
}