English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB базовый учебник

MongoDB продвинутый учебник

Облачные запросы MongoDB

В этой главе мы изучим охватывающие запросы.

Что такое охватывающий запрос?

Согласно официальной документации 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" }

В конце концов, запомните, если, индекс не может охватывать запрос

  • Любое индексное поле является массивом

  • Любое индексное поле является поддокументом