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

Indexation Mongo sur les tableaux d'objets par rapport aux objets

L'interrogation sera certainement beaucoup plus facile dans le second cas, où 'groups' est un tableau de sous-documents, chacun avec un 'id' et un 'name'.

Mongo ne prend pas en charge les requêtes "joker", donc si vos documents étaient structurés de la première manière et que vous vouliez trouver un sous-document avec la valeur "hi", mais ne saviez pas que la clé était 152, vous ne seriez pas en mesure de fais le. Avec la deuxième structure de document, vous pouvez facilement interroger {"groups.name":"hi"}.

Pour plus d'informations sur l'interrogation des objets intégrés, veuillez consulter la documentation intitulée "Dot Notation (Reaching into Objects)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 Les sections "Value in an Array" et "Value in an Embedded Object" de la documentation "Advanced Queries" sont également utiles :http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

Pour un index sur {'groups.id':1}, une entrée d'index sera créée pour chaque clé "id" dans chaque tableau "groups" dans chaque document. Avec un index sur "groupes", une seule entrée d'index sera créée par document.

Si vous avez des documents du second type, et un index sur les groupes, vos requêtes devront correspondre à des sous-documents entiers afin d'utiliser l'index. Par exemple, étant donné le document :

{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }

La requête

db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }}) 

utilisera l'index, mais les requêtes

db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})

ou

db.<collectionName>.find({"groups.name":"hi"})

Ne fera pas.

Les index que vous créez doivent dépendre des requêtes que vous effectuerez le plus souvent.

Vous pouvez tester les index (le cas échéant) que vos requêtes utilisent avec la commande .explain(). http://www.mongodb.org/display/DOCS/Explain La première ligne, "cursor" vous dira quel index est utilisé. "cursor" :"BasicCursor" indique qu'une analyse complète de la collection est en cours d'exécution.

Il y a plus d'informations sur l'indexation dans la documentation :http://www.mongodb.org/display /DOCS/Index

La section "Indexing Array Elements" des liens ci-dessus vers le document intitulé "Multikeys" :http ://www.mongodb.org/display/DOCS/Multikeys

J'espère que cela améliorera votre compréhension de la façon d'interroger les documents intégrés et de la façon dont les index sont utilisés. N'hésitez pas à nous faire savoir si vous avez des questions complémentaires !