w3resource

Query Array of Objects in MongoDB Easily

How to Query an Array of Objects in MongoDB?

To search for specific elements within an array of objects in MongoDB, you can use the find() method with dot notation or specific array operators like $elemMatch. This enables you to locate documents where at least one object in the array matches specified criteria.

Description:

In MongoDB, you can query for specific values within an array of objects by using the $elemMatch operator or dot notation. This is useful when working with nested data structures, as it lets you retrieve documents that contain an object in the array matching certain field values.

Syntax:

There are two main ways to search within an array of objects:

  • Dot Notation: Directly query the array's nested fields.
  • $elemMatch: Use $elemMatch to match entire objects in an array based on multiple criteria.
// Using dot notation
db.<collection>.find({
  "<array_field>.<object_field>": <value>
})

// Using $elemMatch
db.<collection>.find({
  <array_field>: { $elemMatch: { <object_field>: <value>, <other_field>: <value> } }
})

Explanation:

  • <collection>: The MongoDB collection you are querying.
  • <array_field>: The array field that contains objects.
  • <object_field>: The field within each object in the array.
  • <value>: The value you are searching for within the object field.

Example:

Consider a students collection, where each document has a grades field (an array of objects), and each object in grades contains subject and score fields. Here’s how to find all students with a score of 85 in "Math".

Using Dot Notation

Code:

// Query to find documents with a 'grades' array containing a 'Math' subject with score 85
db.students.find({
  "grades.subject": "Math",        // Search for 'Math' in the 'subject' field within 'grades' array
  "grades.score": 85               // Search for a score of 85 within 'grades' array
})

Using $elemMatch

Code:

// Query using $elemMatch to match a 'Math' subject with a score of 85 within 'grades' array
db.students.find({
  grades: {
    $elemMatch: {
      subject: "Math",             // Find object with subject equal to 'Math'
      score: 85                    // and score equal to 85
    }
  }
})

Explanation:

  • Dot Notation
    • This approach directly accesses the grades.subject and grades.score fields in the array. MongoDB checks each object in the array and returns documents where any object matches both conditions (subject is "Math" and score is 85).
  • $elemMatch Operator
    • $elemMatch allows you to match multiple conditions within a single object in the array.
    • MongoDB will look for objects in the grades array where both subject is "Math" and score is 85. This ensures that these two criteria apply to the same object within the array.

Additional Notes:

  • Single Condition: For simple cases with only one condition, dot notation is sufficient and often faster.
  • Complex Conditions: Use $elemMatch when you need multiple conditions to match within the same object in the array.

Example:

If there are documents with a grades array containing { "subject": "Math", "score": 85 }, the query will return:

Output:

[
  {
    "_id": ObjectId("64b7a8d9c1b4"),
    "name": "John Doe",
    "grades": [
      { "subject": "Math", "score": 85 },
      { "subject": "English", "score": 90 }
    ]
  },
  {
    "_id": ObjectId("64b7a8e9c1c5"),
    "name": "Jane Smith",
    "grades": [
      { "subject": "Math", "score": 85 },
      { "subject": "Science", "score": 80 }
    ]
  }
]

This output shows students who have a score of 85 in the "Math" subject within their grades array.



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://www.w3resource.com/mongodb/snippets/how-to-query-an-array-of-objects-in-mongodb.php