MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Index de sous-document en mongo

Vous pouvez faire soit :

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})

Ceci est discuté dans la documentation sous indexes-on-embedded-fields et indexes on sub documents

La section importante de la section du sous-document est 'Lorsque vous effectuez des correspondances d'égalité sur des sous-documents, l'ordre des champs est important et les sous-documents doivent correspondre exactement.'

Cela signifie que les 2 index sont les mêmes pour les requêtes simples.

Cependant, comme le montre l'exemple de sous-document, vous pouvez obtenir des résultats intéressants (auxquels vous ne vous attendez peut-être pas) si vous indexez simplement le sous-document entier par opposition à un champ spécifique, puis effectuez un opérateur de comparaison (comme $gte ) - si vous indexez un sous-champ spécifique, vous obtenez un index moins flexible, mais potentiellement plus utile.

Tout dépend vraiment de votre cas d'utilisation.

Quoi qu'il en soit, une fois que vous avez créé l'index, vous pouvez vérifier ce qui est créé avec :

> db.collection.getIndexes()
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "test.collection",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "data.name" : 1,
        "data.age" : 1,
        "data.job" : 1
    },
    "ns" : "test.collection",
    "name" : "data.name_1_data.age_1_data.job_1"
}

]

Comme vous pouvez le voir sur la sortie, il a créé une nouvelle clé appelée data.name_1_data.age_1_data.job_1 (le _id_ l'index est toujours créé).

Si vous voulez tester votre nouvel index alors vous pouvez faire :

> db.collection.insert({data:{name: "A",age:"B", job : "C"}})
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}})
> db.collection.find({"data.name" : "A"}).explain()
{
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1",
     .... more stuff

L'essentiel est que vous puissiez voir que votre nouvel index a été utilisé (BtreeCursor data.name_1_data.age_1_data.job_1 dans le champ du curseur est ce qui indique que c'est le cas). Si vous voyez "cursor" : "BasicCursor" , votre index n'a pas été utilisé.

Pour des informations plus détaillées, regardez ici.