2012-01-30 12 views
24

La documentación mongodb para multikeys da un ejemplo de la consulta de campos de objetos incrustados en una matriz:En MongoDB, ¿cómo se indexan los campos de un objeto incrustado en una matriz?

http://www.mongodb.org/display/DOCS/Multikeys

Pero no hay ninguna explicación sobre cómo se crea un índice para esa situación. Crear un índice en la matriz no parece funcionar (usando el mecanismo de explicación puede ver que el índice no se usa).

detalles adicionales:

> // find posts where julie commented 
> db.posts.find({ "comments.author" : "julie" }) 
{"title" : "How the west was won", 
"comments" : [{"text" : "great!" , "author" : "sam"}, 
       {"text" : "ok" , "author" : "julie"}], 
"_id" : "497ce79f1ca9ca6d3efca325"} 

Si lo hace db.articles.ensureIndex({ comments : 1 }) que no indexará los subcampos de los comentarios objetos sino sólo los comentarios propio objeto.

Así que lo siguiente sería utilizar el índice:

> db.posts.find({comments : { "author" : "julie", "text" : "ok" } }) 

Debido a que es búsqueda sobre los comentarios objetos

Pero los siguientes no utilizaría el índice:

> db.posts.find({ "comments.author" : "julie" }) 

Entonces, ¿cómo hacer ¿conseguiste mongodb para indexar para el segundo caso?

+0

Atención a mostrar un poco de código en la forma en que está haciendo las cosas? – staackuser2

+0

Por lo que puedo decir, sí te dice cómo agregar este índice: 'db.articles.ensureIndex ({tags: 1})'. –

Respuesta

-1

crea el índice como si lo hiciera con un campo "normal";

db.[collection].ensureIndex({ [yourArrayField] : 1 }) 
+2

Eso solo indexará los objetos en la matriz y no los campos en los objetos, he agregado algunos detalles adicionales en la pregunta para demostrar. – Imran

+0

Si la matriz contiene una cadena simple en lugar de un objeto complejo, @japrescott es correcta – Jimmy

39

puede crear el siguiente índice:

db.posts.ensureIndex({"comments.author" : 1}) 

Este índice sólo el campo de autor de los documentos incrustados. Tenga en cuenta que el índice se utiliza para

db.posts.find({ "comments.author" : "julie" }) 

Así como

db.posts.find({ comments: {$elemMatch: {author : "julie" }}}) 
+2

Sí. Creo que el punto clave aquí es que el OP y la otra respuesta perdieron es que el índice está dividido por puntos y está entre comillas dobles. – jdi

+0

@jdi Si tuviera que encontrar un comentario en una publicación y ejecutar 'createIndex ({" author ": 1})' en ella daría el mismo resultado que la ejecución 'db.posts.ensureIndex ({" comments.author ": 1})'? – unflores

Cuestiones relacionadas