Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in Web Technology by (47.6k points)

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

2 Answers

0 votes
by (106k points)

The main 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.

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}] 

}

0 votes
by (107k points)

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 with the help of the above tests, it looks like the second one is faster.

Related questions

0 votes
1 answer
asked Jun 23, 2020 in Web Technology by Sudhir_1997 (55.6k points)
0 votes
1 answer
0 votes
1 answer
asked Jun 23, 2020 in Web Technology by Sudhir_1997 (55.6k points)
0 votes
1 answer
asked Jun 23, 2020 in Web Technology by Sudhir_1997 (55.6k points)
0 votes
1 answer
asked Jun 23, 2020 in Web Technology by Sudhir_1997 (55.6k points)

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...