MongoDB: Find documents whose array contains a specific value

Updated: February 3, 2024 By: Guest Contributor Post a comment

Introduction

Finding documents in a MongoDB database that contain an array with a specific value is a common task for developers. This tutorial will explore various scenarios, ranging from basic finds to more complex searches, to help you master querying documents based on the contents of an array field.

Let’s start with understanding the basic query for finding documents where an array contains a specific value and gradually move towards more complex queries.

Basic Example

Consider a collection named users with documents resembling the following structure:

{
  "name": "John Doe",
  "interests": ["coding", "hiking", "cooking"]
}

Our goal is to find users who are interested in ‘coding’. Here’s how you can achieve that:

db.users.find({"interests": "coding"})

This query returns all documents where the interests array contains ‘coding’.

Using $in for Multiple Values

What if you want to find users interested in either ‘coding’ or ‘hiking’? You can use the $in operator as follows:

db.users.find({"interests": {"$in": ["coding", "hiking"]}})

This query returns documents where the interests array contains either ‘coding’, ‘hiking’, or both.

Working with Nested Arrays

Let’s take our queries a notch higher. Consider a collection orders, where each document contains nested arrays:

{
  "order_id": 123,
  "products": [
    { "name": "laptop", "quantity": 2 },
    { "name": "phone", "quantity": 1 }
  ]
}

To find orders that include a ‘laptop’, you need to match objects within an array. You can achieve this by using the dot notation and the $elemMatch operator:

db.orders.find({"products": {"$elemMatch": {"name": "laptop"}}})

This query will search through each object in the products array to find at least one object with the name key equal to ‘laptop’.

Matching Multiple Conditions in Nested Arrays

If you want to find documents where the products array includes a ‘laptop’ with a quantity of more than one, you can combine $elemMatch with other operators like $gt (greater than):

db.orders.find({
  "products": {
    "$elemMatch": {
      "name": "laptop",
      "quantity": { "$gt": 1 }
    }
  }
})

This query returns documents where at least one object in the products array meets all specified conditions.

Advanced Queries with Aggregation

For more complex scenarios, the MongoDB aggregation framework offers powerful tools. For instance, if you wish to count how many users have ‘coding’ as an interest, you can do the following:

db.users.aggregate([
  {"$match": {"interests": "coding"}},
  {"$count": "coding_enthusiasts"}
])

This pipeline first filters documents where ‘coding’ is in the interests array, then counts those documents. The result is a document with the number of coding enthusiasts.

Conclusion

Through this tutorial, we’ve explored several methods to find documents in MongoDB where an array contains a specific value. Starting from the basics, we moved to more complex scenarios involving nested arrays and aggregation. Mastering these techniques will significantly enhance your ability to query and analyze data in MongoDB.