query objects elemmatch array all mongodb indexing

objects - mongodb query array of documents



Índices MongoDB para $ elemMatch (1)

La página de ayuda de índices en http://www.mongodb.org/display/DOCS/Indexes no menciona $ elemMatch y desde hace días para agregar un índice en mi colección de objetos de 2M + pensé que podría preguntar esto:

Estoy haciendo una consulta como:

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

Si agrego un índice

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

¿Esta consulta con el componente $ elemMatch podrá ejecutarse completamente a través del índice?


Según su consulta, me imagino que sus documentos se verán así:

{ "_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, creé el índice y ejecuté la consulta que publicó con la opción .explain ().

El índice se está utilizando 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 .explain () se puede encontrar aquí: http://www.mongodb.org/display/DOCS/Explain

.explain () se puede usar para mostrar información sobre una consulta, incluido el índice (si existe) que se utiliza.