web-dev-qa-db-fra.com

Index des sous-documents en mongo

Que se passe-t-il exactement lorsque j'appelle ensureIndex(data) lorsque les données typiques ressemblent à data:{name: "A",age:"B", job : "C"}? Créera-t-il un index composé sur ces trois champs ou créera-t-il un seul index applicable lorsque quoi que ce soit des données est demandé ou quelque chose de complètement différent?

35
slezadav

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-sur-champs-intégrés et index sur les sous-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 tout le sous-document 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 (les _id_ l'index est toujours créé).

Si vous souhaitez tester votre nouvel index, 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 pouvez 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 l'affaire). Si tu vois "cursor" : "BasicCursor", votre index n'a pas été utilisé.

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

44
jimoleary