Учебники

MongoDB — Расширенное индексирование

Рассмотрим следующий документ из коллекции пользователей

{
   "address": {
      "city": "Los Angeles",
      "state": "California",
      "pincode": "123"
   },
   "tags": [
      "music",
      "cricket",
      "blogs"
   ],
   "name": "Tom Benzamin"
}

Приведенный выше документ содержит адресный поддокумент и массив тегов .

Индексирование полей массива

Предположим, мы хотим искать пользовательские документы на основе тегов пользователя. Для этого мы создадим индекс по массиву тегов в коллекции.

Создание индекса для массива, в свою очередь, создает отдельные записи индекса для каждого из его полей. Так что в нашем случае, когда мы создадим индекс по массиву тегов, будут созданы отдельные индексы для его значений музыка, крикет и блоги.

Чтобы создать индекс по массиву тегов, используйте следующий код —

>db.users.ensureIndex({"tags":1})

После создания индекса мы можем искать в поле тегов коллекции следующим образом:

>db.users.find({tags:"cricket"})

Чтобы убедиться, что используется правильное индексирование, используйте следующую команду объяснения

>db.users.find({tags:"cricket"}).explain()

Приведенная выше команда привела к появлению «курсора»: «BtreeCursor tags_1», который подтверждает, что используется правильная индексация.

Индексирование полей вложенных документов

Предположим, что мы хотим искать документы по полям города, штата и пин-кода. Поскольку все эти поля являются частью поля вложенного документа, мы создадим индекс для всех полей вложенного документа.

Для создания индекса по всем трем полям вложенного документа используйте следующий код:

>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

Как только индекс создан, мы можем искать любое из полей поддокумента, используя этот индекс следующим образом:

>db.users.find({"address.city":"Los Angeles"})   

Помните, что выражение запроса должно следовать порядку указанного индекса. Таким образом, созданный выше индекс будет поддерживать следующие запросы:

>db.users.find({"address.city":"Los Angeles","address.state":"California"}) 

Он также будет поддерживать следующий запрос —