Indexation avancée

30 min Niveau 8

Nous avons inséré le document suivant dans la collection nommée "users" comme indiqué ci-dessous.

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 d'adresse et un tableau de balises.

Indexation des champs d'un tableau

Supposons que nous voulions rechercher des documents d'utilisateurs en fonction des balises de l'utilisateur. Pour cela, nous allons créer un index sur le tableau des tags dans la collection.

La création d'un index sur un tableau crée à son tour des entrées d'index distinctes pour chacun de ses champs. Ainsi, dans notre cas, lorsque nous créons un index sur le tableau des tags, des index séparés seront créés pour les valeurs musique, cricket et blogs.

Pour créer un index sur un tableau de balises, 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 effectuer une recherche sur le champ des tags de la collection comme ceci -

> 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 que l'indexation correcte est utilisée, utilisez la commande explain suivante : -.

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

Cela vous donne le résultat suivant -

{
    "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
}
>

La commande ci-dessus a donné comme résultat "cursor" : "BtreeCursor tags_1" ce qui confirme que l'indexation correcte est utilisée.

Indexation des champs de sous-documents

logo discord

Besoin d'aide ?

Rejoignez notre communauté officielle et ne restez plus seul à bloquer sur un problème !

En savoir plus