Использование индексов mongodb с подсказкой()

#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, здесь выполняется явная сортировка.

Порядок запроса для достижения наилучшей производительности: Равенство, сортировка, диапазон