В этой главе мы узнаем о покрытых запросах.
Что такое закрытый запрос?
Согласно официальной документации MongoDB, покрытый запрос — это запрос, в котором:
- Все поля в запросе являются частью индекса.
- Все поля, возвращаемые в запросе, имеют одинаковый индекс.
Поскольку все поля, присутствующие в запросе, являются частью индекса, MongoDB сопоставляет условия запроса и возвращает результат, используя тот же индекс, фактически не заглядывая в документы. Поскольку индексы присутствуют в оперативной памяти, выборка данных из индексов происходит намного быстрее, чем выборка данных путем сканирования документов.
Использование покрытых запросов
Чтобы проверить покрытые запросы, рассмотрите следующий документ в коллекции пользователей —
{ "_id": ObjectId("53402597d852426020000002"), "contact": "987654321", "dob": "01-01-1991", "gender": "M", "name": "Tom Benzamin", "user_name": "tombenzamin" }
Сначала мы создадим составной индекс для коллекции пользователей по полам пола и имени пользователя, используя следующий запрос —
>db.users.ensureIndex({gender:1,user_name:1})
Теперь этот индекс будет охватывать следующий запрос —
>db.users.find({gender:"M"},{user_name:1,_id:0})
То есть, для вышеупомянутого запроса MongoDB не будет искать документы базы данных. Вместо этого он будет извлекать необходимые данные из проиндексированных данных, что очень быстро.
Поскольку наш индекс не включает поле _id , мы явно исключили его из набора результатов нашего запроса, так как MongoDB по умолчанию возвращает поле _id в каждом запросе. Таким образом, следующий запрос не был бы покрыт внутри индекса, созданного выше —
>db.users.find({gender:"M"},{user_name:1})
И наконец, помните, что индекс не может покрыть запрос, если —