query objects mongo elemmatch array mongodb mongodb-indexes

mongodb - elemmatch - mongoose find in array of objects



Mongo indexando en arrays de objetos vs objetos (1)

Las consultas serán mucho más fáciles en el segundo caso, donde "grupos" es una matriz de sub-documentos, cada uno con un "id" y un "nombre".

Mongo no admite consultas de "comodín", por lo que si sus documentos estuvieran estructurados de la primera manera y quisiera encontrar un sub-documento con el valor "hola", pero no sabía que la clave era 152, no podría hazlo. Con la segunda estructura de documento, puede consultar fácilmente {"groups.name": "hi"}.

Para obtener más información sobre la consulta de objetos incrustados, consulte la documentación titulada "Notación de puntos (Llegar a objetos)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 The "Value en las secciones "Valor y en un objeto incorporado" de la documentación de "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 "groups" 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 en grupos, sus consultas tendrán que coincidir con sub-documentos completos para hacer uso del í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 hare

El (los) índice (s) que cree dependerá de las consultas que realice con mayor frecuencia.

Puede experimentar con los índices (si los hay) que utilizan 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 una exploración de colección completa.

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

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

Esperamos que esto mejore su comprensión de cómo consultar en documentos incrustados y cómo se utilizan los índices. Por favor, háganos saber si tiene alguna pregunta de seguimiento!

Estoy implementando una base de datos de contactos que maneja bastantes campos. La mayoría de ellos están predefinidos y pueden considerarse vinculados, pero hay una pareja que no lo está. Llamaremos a uno de estos campos ''grupos''. La forma en que lo implementamos actualmente es (cada documento / contacto tiene un campo de ''grupos''):

''groups'' : { 152 : ''hi'', 111 : ''group2'' }

pero después de leer un poco, parece que debería hacerlo:

''groups'' : [ { ''id'' : 152, ''name'' : ''hi'' }, { ''id'' : 111, ''name'' : ''group2'' } ... ]

y luego aplique el índice db.contact.ensureIndex({''groups.id'':1});

Mi pregunta es con respecto a la funcionalidad. ¿Cuáles son las diferencias entre las 2 estructuras y cómo se construye realmente el índice (está simplemente indexando dentro de cada documento / contacto o está creando un índice a gran escala que tiene todos los grupos de todos los documentos / contactos?).

Estoy entrando bajo el supuesto de que esta es estructuralmente la mejor manera, pero si soy incorrecta, avísame.