English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Nous avons inséré les documents suivants dans la collection nommée users, comme suit–
db.users.insert( { "address": { "city": "Los Angeles" "state": "California" "pincode": ""123" } "tags": [ "music", "cricket", "blogs" ], "name": "Tom Benzamin" } )
Le document ci-dessus contient un sous-document address et un array de marqueurs.
Supposons que nous voulions rechercher des documents utilisateur en fonction de leurs marqueurs. À cette fin, nous créerons un index sur l'array tags de la collection.
La création d'un index sur un array, il faut créer un index sur chaque champ de l'array individuellement. Donc dans notre exemple, lorsque nous créons un index sur l'array tags, nous en créons un pour les valeurs music, cricket et blogs.
Pour créer un index sur l'array de tags, utilisez le code suivant-
>db.users.createIndex({"tags":1} { "createdCollectionAutomatically": false "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 } >
Après avoir créé l'index, nous pouvons rechercher sur le champ tags de la collection, comme suit-
>db.users.find({tags:"cricket"}).pretty(){ "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" } "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" } >
Pour vérifier si l'index correct a été utilisé, utilisez la commande explain suivante-
>db.users.find({tags:"cricket"}).explain()
Cela vous donne les résultats suivants-
{ "queryPlanner": { "plannerVersion": 1, "namespace": "mydb.users" "indexFilterSet": false "parsedQuery" : { "tags" : { "$eq" : "cricket" } } "queryHash" : "9D3B61A7", "planCacheKey" : "0",4C9997B", "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { 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 } >
La commande ci-dessus a généré “ cursor”:“ BtreeCursor tags_1”,它确认使用了正确的索引。
Supposons que nous voulions rechercher des documents en fonction des champs city, state et pincode. Comme tous ces champs font partie de la sous-document d'adresse, nous créerons un index sur tous les champs de la sous-document.
Pour créer un index sur les trois champs de sous-document de tous les documents, utilisez le code suivant-
>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1} { "numIndexesBefore" : 4, "numIndexesAfter" : 4, "note" : "all indexes already exist", "ok" : 1 } >
Après la création de l'index, nous pouvons utiliser cet index pour rechercher n'importe quel champ de sous-document, comme indiqué ci-dessous :
> 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" }
请记住,查询表达式必须遵循指定索引的顺序。因此,上面创建的索引将支持以下查询-
>db.users.find({"address.city":"Los Angeles","address.state":"California"}).pretty(){ "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" } "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" } >