English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Мы вставили следующие документы в коллекцию под названием users, как показано ниже–
db.users.insert( { "address": { "city": "Los Angeles" "state": "California" "pincode": "123" } "tags": [ "music", "cricket", "blogs" , "name": "Tom Benzamin" } )
Верхний документ содержит поддокумент address и массив меток.
Предположим, что мы хотим искать документы пользователей по их меткам. Для этого мы создадим индекс на массиве tags в集合е.
При создании индекса на массиве, для каждого поля массива создается отдельный индекс. Поэтому в нашем примере, когда мы создаем индекс на массиве tags, для значений music, cricket и blogs создаются отдельные индексы.
Чтобы создать индекс на массиве тегов tags, используйте следующий код-
>db.users.createIndex({"tags":1}) { "createdCollectionAutomatically": false, "numIndexesBefore": 2, "numIndexesAfter": 3, "ok": 1 } >
После создания индекса мы можем искать в поле tags集合а, например-
>db.users.find({tags:"cricket"}).pretty(){ "_id": ObjectId("5dd7c927f1dd4583e7103fdf"), "address": { "city": "Los Angeles", "state": "California", "pincode": "123" } "tags": [ "music", "cricket", "blogs" , "name": "Tom Benzamin" } >
Чтобы проверить, используется ли правильный индекс, используйте следующую команду explain-
>db.users.find({tags:"cricket"}).explain()
Это дает вам следующие результаты-
{ "queryPlanner": { "plannerVersion": 1, "namespace": "mydb.users", "indexFilterSet": false, "parsedQuery": { "tags": { "$eq": "cricket" } } "queryHash": "9D3B61A7", "planCacheKey": "04C9997B" "winningPlan": { "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "tags": 1 } "indexName": "tags_1", "isMultiKey": false, "multiKeyPaths": { "tags": [], } "isUnique": false, "isSparse": false, "isPartial": false, "indexVersion": 2, "direction": "forward", "indexBounds": { "tags": [ "[\"cricket\", \"cricket\"]" ] } } } "rejectedPlans": [], } "serverInfo": { "host": "Krishna", "port": 27017, "version": "4.2.1", "gitVersion": "edf6d45851c0b9ee15548f0f847df141764a317e" } "ok": 1 } >
Команда выше产生了 "курсор": "BtreeCursor tags_1", что подтверждает использование правильного индекса.
Предположим, что мы хотим поиска документов по полям city, state и pincode. Поскольку все эти поля являются частью поддокумента адреса, мы создадим индекс на всех полях поддокумента.
Для создания индекса на всех трех полях поддокумента используйте следующий код:
>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1}) { "numIndexesBefore": 4, "numIndexesAfter": 4, "note": "all indexes already exist", "ok": 1 } >
Создание индекса позволяет использовать его для поиска любого поля поддокумента, например:
db.users.find({"address.city":"Los Angeles"}).pretty(){ "_id": ObjectId("5dd7c927f1dd4583e7103fdf"), "address": { "city": "Los Angeles", "state": "California", "pincode": "123" } "tags": [ "music", "cricket", "blogs" , "name": "Tom Benzamin" }
Запомните, что выражение запроса должно следовать порядку指定的 индексов. Таким образом, созданные индексы будут поддерживать следующие запросы -
Запомните, что выражение запроса должно следовать порядку指定的 индексов. Таким образом, созданные индексы будут поддерживать следующие запросы - "_id": ObjectId("5dd7c927f1dd4583e7103fdf"), "address": { "city": "Los Angeles", "state": "California", "pincode": "123" } "tags": [ "music", "cricket", "blogs" , "name": "Tom Benzamin" } >