2012-04-18 11 views
9

Los índices ayudan en la página http://www.mongodb.org/display/DOCS/Indexes no menciona $ elemMatch y ya que días días para añadir un índice en mi colección de objetos 2M + pensé que pido esto:

que estoy haciendo una consulta como:

{ lc: "eng", group: "xyz", indices: { $elemMatch: { text: "as", pos: { $gt: 1 } } } } 

Si añado un índice

{lc:1, group:1, indices.text:1, indices.pos:1} 

será esta consulta con el componente $ elemMatch ser capaz de ser ejecutado totalmente a través del índice?

Respuesta

15

Sobre la base de la consulta, me imagino que sus documentos tienen el siguiente aspecto:

{ 
    "_id" : 1, 
    "lc" : "eng", 
    "group" : "xyz", 
    "indices" : [ 
     { 
      "text" : "as", 
      "pos" : 2 
     }, 
     { 
      "text" : "text", 
      "pos" : 4 
     } 
    ] 
} 

creé una colección de prueba con documentos de este formato, creado el índice, y corrió la consulta que usted envió a la .explain() opción.

El índice se utiliza como se esperaba:

> db.test.ensureIndex({"lc":1, "group":1, "indices.text":1, "indices.pos":1}) 
> db.test.find({ lc: "eng", group: "xyz", indices: { $elemMatch: { text: "as", pos: { $gt: 1 } } } }).explain() 
{ 
    "cursor" : "BtreeCursor lc_1_group_1_indices.text_1_indices.pos_1", 
    "isMultiKey" : true, 
    "n" : NumberLong(1), 
    "nscannedObjects" : NumberLong(1), 
    "nscanned" : NumberLong(1), 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : NumberLong(0), 
    "millis" : 0, 
    "indexBounds" : { 
     "lc" : [ 
      [ 
       "eng", 
       "eng" 
      ] 
     ], 
     "group" : [ 
      [ 
       "xyz", 
       "xyz" 
      ] 
     ], 
     "indices.text" : [ 
      [ 
       "as", 
       "as" 
      ] 
     ], 
     "indices.pos" : [ 
      [ 
       { 
        "$minElement" : 1 
       }, 
       { 
        "$maxElement" : 1 
       } 
      ] 
     ] 
    }, 
    "server" : "Marcs-MacBook-Pro.local:27017" 
} 

La documentación sobre la función • Explicar() se puede encontrar aquí: http://www.mongodb.org/display/DOCS/Explain

• Explicar() puede utilizarse para mostrar información sobre una consulta, incluido el índice (si corresponde) utilizado.

+0

Gracias Marc - y sí mis documentos se ven así. Observé desde el explicar que 'indexOnly' es falso. ¿Eso no indica que el BSON tuvo que ser desempaquetado y escaneado a pesar de que todos los campos están en el índice? –

+0

¡Feliz de ayudar! IndexOnly no es posible con un índice multikey. Esto se debe a que cada uno de los documentos incrustados tiene su propia entrada en el índice. Toda la matriz de "índices" no se almacena en una sola entrada de índice. Por lo tanto, aunque se use el índice, los documentos reales deben leerse. Esto se explica en la sección "Coincidencia exacta de matrices con un índice" de la documentación de "Multikeys": http://www.mongodb.org/display/DOCS/Multikeys – Marc

+0

Puedo entender que si consulté 'db.test.find ({lc: "eng", grupo: "xyz", "indices.text:" como "," indices.pos ": {$ gt: 1}}})' sin el $ elemMatch que necesitaría para escanear objetos, pero dado que elemMatch requiere el mismo subobjeto que ya estaría en la entrada del índice, ¿no? –

Cuestiones relacionadas