Покрытый запрос MongoDB

В официальной документации MongoDB сказано, что покрывающий запрос — это запрос, в котором:

  • Все поля запроса являются частью индекса
  • Все поля, возвращаемые в запросе, находятся в одном и том же индексе

Поскольку все поля, присутствующие в запросе, являются частью индекса, MongoDB не нужно просматривать все документы данных, чтобы сопоставить условия запроса и вернуть результаты запроса, используя тот же индекс.

Поскольку индексы существуют в оперативной памяти (RAM), получение данных из индекса происходит намного быстрее, чем чтение данных путем сканирования документов.


Использование покрывающих запросов

Чтобы протестировать покрывающие запросы, используйте следующую коллекцию `users`:

{
   "_id": ObjectId("53402597d852426020000002"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

Мы создаем составной индекс в коллекции `users` с полями `gender` и `user_name`:

>db.users.createIndex({gender:1,user_name:1})

Примечание:В версиях до 5.0 можно использовать `db.collection.ensureIndex()`, но `ensureIndex()` был удален в версии 5.0; вместо него используйте `createIndex()`.

Теперь этот индекс покрывает следующий запрос:

>db.users.find({gender:"M"},{user_name:1,_id:0})

То есть для приведенного выше запроса MongoDB не будет искать в файлах базы данных. Вместо этого она извлечет данные из индекса, что представляет собой очень быстрый запрос данных.

Поскольку наш индекс не включает поле `_id`, в запросе по умолчанию возвращается `_id`. Мы можем исключить его из набора результатов запроса MongoDB.

Следующий пример не исключает `_id`, поэтому запрос не будет покрытым:

>db.users.find({gender:"M"},{user_name:1})

Наконец, следующие запросы не могут использовать покрытые запросы:

  • Все поля индекса являются массивом
  • Все поля индекса являются поддокументом
Другие расширения