Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

226
Visualizações
$elemMatch query in MongoDB

I have a collection 'name' with 2 documents of the structure :

doc 1:

    {
    a: 1
    b : [{name:"AAA",age:10},
         {name:"BBB",age:12},
         {name:"CCC",age:13}]
    }

doc 2 :

    {
    a: 2
    b : [{name:"DDD",age:14},
         {name:"EEE",age:15},
         {name:"FFF",age:16}]
    }

Since I am new to MongoDB, I am trying to find the difference of using the $elemMatch operator and not using it. Basically I am trying to query and find the first doc ( doc 1) with name AAA and age 10. So using the $elemMatch, my query looks like this :

db.name.find({b: {$elemMatch :{name:"AAA",age:10}}})

This query works perfectly fine, but my question is that what's the need to use this query when I can query like this :

db.name.find({b:{name:"AAA",age:10}})

I am sure there should be some reason for $elemMatch, just trying to find the difference. Thanks in advance for the reply !!!

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

The key difference is that the second query (without the $elemMatch) would only match elements in the b array that only contained those two fields, and only in that order.

So the first query would match the following two documents, but the second query wouldn't:

{
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 Relatório

0

Another important difference is that how Mongo uses indexes.

If we have declared a multi-key-compound index:

db.name.createIndex({ "b.name": 1, "b.age": 1 })

And we execute this:

db.name.explain().find({
  b: {
    name: "DDD",
    age: 14
  }
})

we get:

"winningPlan" : {
  "stage" : "COLLSCAN",

If we execute this:

db.name.explain().find({
  b: {
    $elemMatch: {
      name: "DDD",
      age: 14
    }
  }
})

we get:

"winningPlan" : {
  "stage" : "FETCH",
  "inputStage" : {
    "stage" : "IXSCAN",

But if we have a simple multi-key index in the array:

db.name.createIndex({b: 1})

The above index will be used in this query:

db.name.explain().find({
  b: {
    name: "DDD",
    age: 14
  }
})

And under my very un-professional profiling tests looks like this is faster.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda