Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

227
Views
consulta $elemMatch en MongoDB

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 !!!

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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}] }
over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!