Продвинутое индексирование MongoDB
Рассмотрим следующую коллекцию документов (users):
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
Приведённые выше документы содержат поддокумент address и массив tags.
Индексирование полей массива
Предположим, мы извлекаем пользователей на основе tags. Для этого нам нужно создать индекс по массиву tags в коллекции.
Создание индекса для массива требует последовательного построения индекса для каждого поля в массиве. Поэтому когда мы создаём индекс для массива tags, будут созданы отдельные индексы для трёх значений: music, cricket и blogs.
Используйте следующую команду, чтобы создать индекс для массива:
>db.users.ensureIndex({"tags":1})
После создания индекса мы можем извлечь поле tags коллекции так:
>db.users.find({tags:"cricket"})
Чтобы убедиться, что мы использовали индекс, можно воспользоваться командой explain:
>db.users.find({tags:"cricket"}).explain()
Если результат выполнения приведённой выше команды показывает "cursor": "BtreeCursor tags_1", это означает, что индекс был использован.
Индексация полей поддокумента
Предположим, нам нужно извлекать документы по полям city, state и pincode. Поскольку эти поля являются полями поддокумента, нам нужно создать индекс для поддокумента.
Создайте индекс по трём полям поддокумента с помощью следующей команды:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
После создания индекса мы можем использовать поля поддокумента для извлечения данных:
>db.users.find({"address.city":"Los Angeles"})
Выражение запроса не обязательно должно следовать порядку указанных полей индекса; MongoDB автоматически оптимизирует его. Поэтому созданный выше индекс будет поддерживать следующие запросы:
>db.users.find({"address.state":"California","address.city":"Los Angeles"})
Он также поддерживает следующие запросы:
>db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"})
Другие расширения