#mongodb #mongodb-query #aggregation-framework
Вопрос:
Я столкнулся с этим вопросом в курсе mongodb, который я проходил: мы должны найти параметры, которые будут переданы подсказке() приведенного ниже запроса, чтобы получить желаемый результат.
var exp = db.restaurants.explain("executionStats")
exp.find({ "address.state": "NY", stars: { $gt: 3, $lt: 4 } }).sort({ name: 1 }).hint(REDACTED)
O/P:
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "m201.restaurants",
"indexFilterSet": false,
"parsedQuery": "REDACTED",
"winningPlan": {
"stage": "SORT",
"sortPattern": {
"name": 1
},
"inputStage": {
"stage": "SORT_KEY_GENERATOR",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": "REDACTED",
"indexName": "REDACTED",
"isMultiKey": false,
"isUnique": false,
"isSparse": false,
"isPartial": false,
"indexVersion": 1,
"direction": "forward",
"indexBounds": "REDACTED"
}
}
}
},
"rejectedPlans": [ ]
},
"executionStats": {
"executionSuccess": true,
"nReturned": 3335,
"executionTimeMillis": 20,
"totalKeysExamined": 3335,
"totalDocsExamined": 3335,
"executionStages": "REDACTED"
},
"serverInfo": "REDACTED",
"ok": 1
}
ОТВЕТ, КОТОРЫЙ НУЖНО ВВЕСТИ : { «адрес.штат»: 1, «звезды»: 1, «имя»: 1 }
Учитывая ответ выше, я не понимаю, что, если address.state, звезды и имя заданы в качестве индексов, и поскольку запрос содержит весь префикс в порядке составного индекса, этап сортировки в памяти не должен выполняться. Но здесь сортировка происходит, несмотря на наличие индекса имени в конце параметров индекса, передаваемых функции. Почему сортировка происходит явно, несмотря на указание индекса имени?
Ответ №1:
Ах, нашел ответ, ключи в индексе можно использовать для фильтрации и сортировки данных, если предикат запроса содержит только условия равенства. Поскольку мы используем $gt и $lt, здесь выполняется явная сортировка.
Порядок запроса для достижения наилучшей производительности: Равенство, сортировка, диапазон