Продвинутое индексирование 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"})
Другие расширения