sql >> データベース >  >> NoSQL >> MongoDB

(どのように)aggregate()はインデックスを壊すことができますか?

    問題は、集計によってインデックスが破損することではなく、集計がインデックスを使用せず、コレクションスキャンを実行することであると思われます。

    $がある場合、アグリゲーションはインデックスを利用できます。一致および/または$sortステージ パイプラインの先頭に配置されます。この集計は、単一の$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,
        ...
    }
    



    1. TypeError:「in」演算子を使用して[{}]の「_id」を検索することはできません

    2. Node.jsのmongoshelldb.collection.runCommand()と同等です

    3. スキーマが無効です。`mongodb`または`mongodb+srv`が必要です

    4. Pythonを使用してmongodbの一致するサブドキュメントのみを選択する方法