Tengo una colección 'nombre' con 2 documentos de la estructura:
documento 1:
{ a: 1 b : [{name:"AAA",age:10}, {name:"BBB",age:12}, {name:"CCC",age:13}] }documento 2:
{ a: 2 b : [{name:"DDD",age:14}, {name:"EEE",age:15}, {name:"FFF",age:16}] }Como soy nuevo en MongoDB, estoy tratando de encontrar la diferencia entre usar el operador $elemMatch y no usarlo. Básicamente, estoy tratando de consultar y encontrar el primer documento (documento 1) con el nombre AAA y 10 años. Entonces, al usar $ elemMatch, mi consulta se ve así:
db.name.find({b: {$elemMatch :{name:"AAA",age:10}}})Esta consulta funciona perfectamente bien, pero mi pregunta es cuál es la necesidad de usar esta consulta cuando puedo consultar así:
db.name.find({b:{name:"AAA",age:10}})Estoy seguro de que debería haber alguna razón para $elemMatch, solo trato de encontrar la diferencia. Gracias de antemano por la respuesta !!!
La diferencia clave es que la segunda consulta (sin $elemMatch ) solo coincidiría con los elementos de la matriz b que solo contenían esos dos campos, y solo en ese orden.
Entonces, la primera consulta coincidiría con los siguientes dos documentos, pero la segunda consulta no:
{ a: 1 b: [{name: "AAA", age: 10, city: 'New York'}, {name: "BBB", age: 12, city: 'Paris'}, {name: "CCC", age: 13, city: 'London'}] } { a: 1, b: [{age: 10, name: "AAA"}, {name: "BBB", age: 12}, {name: "CCC", age: 13}] }Otra diferencia importante es cómo Mongo usa los índices .
Si hemos declarado un índice multiclave-compuesto:
db.name.createIndex({ "b.name": 1, "b.age": 1 })Y ejecutamos esto:
db.name.explain().find({ b: { name: "DDD", age: 14 } })obtenemos:
"winningPlan" : { "stage" : "COLLSCAN",Si ejecutamos esto:
db.name.explain().find({ b: { $elemMatch: { name: "DDD", age: 14 } } })obtenemos:
"winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN",Pero si tenemos un índice simple de múltiples claves en la matriz:
db.name.createIndex({b: 1})El índice anterior se utilizará en esta consulta:
db.name.explain().find({ b: { name: "DDD", age: 14 } })Y bajo mis pruebas de perfilado muy poco profesionales, parece que esto es más rápido.