2012-03-14 15 views
6

Estoy tratando de averiguar cómo debo estructurar las consultas de modo que golpeen mi índice. tengo documentos estructurados de esta manera:MongoDB - Consulta en el campo anidado con el índice

{ "attributes" : { "make" : "Subaru", "color" : "Red" } } 

con un índice de: db.stuff.ensureIndex({"attributes.make":1})

Lo que he encontrado es que la consulta usando la notación punto golpea el índice al consultar con un documento no lo hace.

Ejemplo:

db.stuff.find({"attributes.make":"Subaru"}).explain() 
{ 
"cursor" : "BtreeCursor attributes.make_1", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 2, 
"millis" : 0, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "attributes.make" : [ 
     [ 
      "Subaru", 
      "Subaru" 
     ] 
    ] 
} 
} 

vs

db.stuff.find({attributes:{make:"Subaru"}}).explain() 
{ 
"cursor" : "BasicCursor", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 0, 
"millis" : 1, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 

} 
} 

¿Hay una manera de conseguir la consulta estilo de documento para golpear el índice? La razón es que al construir consultas desde mis objetos persistentes es mucho más fácil serializarlos como documentos en lugar de algo usando notación de puntos.

También agregaré que estamos usando una capa de mapeador de datos nativa construida con Jackson. ¿Ayudaría algo como Morphia ayudar a construir estas consultas correctamente?

Respuesta

7

Hizo un poco más de excavación y this thread explica qué pasa con la consulta de subdocumentos. Mi problema anterior era que hacer que la consulta basada en el documento secundario actuara como la notación de punto que necesitaba para usar elemMatch.

db.stuff.find({"attributes":{"$elemMatch" : {"make":"Subaru"}}}).explain() 
{ 
"cursor" : "BtreeCursor attributes.make_1", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 0, 
"millis" : 2, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "attributes.make" : [ 
     [ 
      "Subaru", 
      "Subaru" 
     ] 
    ] 
} 
} 
Cuestiones relacionadas