Покрытый запрос 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})
Наконец, следующие запросы не могут использовать покрытые запросы:
- Все поля индекса являются массивом
- Все поля индекса являются поддокументом