Рассмотрим следующий документ из коллекции пользователей —
{ "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"})
Он также будет поддерживать следующий запрос —