English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой главе мы изучим охватывающие запросы.
Согласно официальной документации MongoDB, охватывающий запрос是这样的 запрос, где-
Все поля в запросе являются частью индекса.
Все поля, возвращаемые запросом, находятся в одном индексе.
Поскольку все поля в запросе являются частью индекса, MongoDB будет соответствовать условиям запроса и использовать тот же индекс для возвращения результатов, не проверяя документ в内部的. Поскольку индекс существует в RAM, данные из индекса получают гораздо быстрее, чем данные, полученные сканированием документов.
Чтобы протестировать охватываемые запросы, см.-sers
В коллекции следующие документы-
{ "_id": ObjectId("53402597d852426020000003"), "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}) { "createdCollectionAutomatically": false, "numIndexesBefore": 1, "numIndexesAfter": 2, "ok": 1 }
Теперь этот индекс будет охватывать следующие запросы-
>db.users.find({gender:"M"},{user_name:1,_id:0}) { "user_name" : "tombenzamin" }
То есть, для вышеуказанного запроса MongoDB не будет проверять документы в базе данных. Вместо этого он получит необходимые данные из данных индекса, что очень быстро.
Поскольку индекс не включает_id
Поля, поэтому мы явно исключили их из результатов запроса, так как MongoDB по умолчанию возвращает поле _id в каждом запросе. Таким образом, следующий запрос не будет включен в созданный индекс -
>db.users.find({gender:"M"},{user_name:1}) { "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }
В конце концов, запомните, если, индекс не может охватывать запрос
Любое индексное поле является массивом
Любое индексное поле является поддокументом