Фильтр запроса не ссылается на поле текстового индекса, поэтому планировщик запросов не будет учитывать этот индекс, так как не может быть уверен, что индекс будет возвращать полный набор документов.

дал следующий индекс для моей коллекции:

db.myCollection.createIndex({
  user_id: 1,
  name: 'text'
})

Если я попытаюсь увидеть план выполнения запроса, содержащего оба поля, например:

db.getCollection('campaigns').find({ 
    user_id: ObjectId('xxx')
   ,$text: { $search: 'bla' } 
}).explain('executionStats')

Я получаю следующие результаты:

...
"winningPlan" : {
    "stage" : "TEXT",
    "indexPrefix" : {
        "user_id" : ObjectId("xxx")
    },
    "indexName" : "user_id_1_name_text",
    "parsedTextQuery" : {
        "terms" : [ 
            "e"
        ],
        "negatedTerms" : [],
        "phrases" : [],
        "negatedPhrases" : []
    },
    "inputStage" : {
        "stage" : "TEXT_MATCH",
        "inputStage" : {
            "stage" : "TEXT_OR",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "user_id" : 1.0,
                    "_fts" : "text",
                    "_ftsx" : 1
                },
                "indexName" : "user_id_1_name_text",
                "isMultiKey" : true,
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "backward",
                "indexBounds" : {}
            }
        }
    }
}
...

Как указано вдокументацияMongoDB может использовать префиксы индекса для выполнения индексированных запросов.

посколькуuser_id это префикс для индекса выше, я ожидаю, что запрос толькоuser_id будет использовать индекс, но если я попробую следующее:

db.myCollection.find({ 
    user_id: ObjectId('xxx')
}).explain('executionStats')

Я получил:

...
"winningPlan" : {
    "stage" : "COLLSCAN",
    "filter" : {
        "user_id" : {
            "$eq" : ObjectId("xxx")
        }
    },
    "direction" : "forward"
},
...

Таким образом, он вообще не использует индекс и не выполняет полное сканирование коллекции.

Ответы на вопрос(1)

Ваш ответ на вопрос