sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongo indexación en matrices de objetos frente a objetos

Sin duda, la consulta será mucho más fácil en el segundo caso, donde 'grupos' es una matriz de subdocumentos, cada uno con una 'id' y un 'nombre'.

Mongo no admite consultas de "comodines", por lo que si sus documentos se estructuraron de la primera manera y desea encontrar un subdocumento con el valor "hola", pero no sabe que la clave es 152, no podrá hazlo. Con la segunda estructura del documento, puede consultar fácilmente {"groups.name":"hi"}.

Para obtener más información sobre cómo consultar objetos incrustados, consulte la documentación titulada "Notación de puntos (alcanzar objetos)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Llegando+a+Objetos%29 Las secciones "Valor en una matriz" y "Valor en un objeto incrustado" de la documentación "Consultas avanzadas" también son útiles:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

Para un índice en {'groups.id':1}, se creará una entrada de índice para cada clave "id" en cada matriz de "grupos" en cada documento. Con un índice en "grupos", solo se creará una entrada de índice por documento.

Si tiene documentos del segundo tipo y un índice de grupos, sus consultas deberán coincidir con subdocumentos completos para poder utilizar el índice. Por ejemplo, dado el documento:

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

La consulta

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

hará uso del índice, pero las consultas

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

o

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

no lo haré

Los índices que cree deben depender de las consultas que realizará con mayor frecuencia.

Puede experimentar con qué índices (si los hay) están usando sus consultas con el comando .explain(). http://www.mongodb.org/display/DOCS/Explain La primera línea, "cursor", le indicará qué índice se está utilizando. "cursor":"BasicCursor" indica que se está realizando un análisis completo de la colección.

Hay más información sobre la indexación en la documentación:http://www.mongodb.org/display /DOCS/Índices

La sección "Elementos de matriz de indexación" de los enlaces anteriores al documento titulado "Multikeys":http://www.mongodb.org/display/DOCS/Multikeys

Con suerte, esto mejorará su comprensión de cómo consultar documentos incrustados y cómo se usan los índices. ¡Háganos saber si tiene alguna pregunta de seguimiento!