Home > Net >  Why is $elemMatch return all the documents, instead of the matches?
Why is $elemMatch return all the documents, instead of the matches?

Time:10-17

I'm trying to execute a query that returns only the match documents base on query parameters. I looked in MongoDB's documentation, and it seems like I use the right operator, but something still does not work as I expected.

I have the following schema:

_id: ObjectId('631b875491b16c38eecfa4e9')
brandName: "Nick"
categories: Array
products: Array
 0: Object
   productName: "Vans Shoes dsds Old Skool"
   description: "amazing Shoes."
   categoryId: ObjectId('62f3eaff3ded19dcce71081e')
   price: 240
   numberOfBuyers: 0
  _id: ObjectId(631b875491b16c38eecfa4ec)
1: Object
2: Object
3: Object
__v: 0

The following query should give me only the first document(index 0), but it returns all four of the documents:

  const products = await Brand.find({
    _id: brandId,
    products: {
      $elemMatch: {
        categoryId: "62f3eaff3ded19dcce71081e",
        price: 240
      }
    }
  })

What is wrong?

CodePudding user response:

You are querying on "Brand" documents. This means your query tells Mongoose: if one of the products is matching (categoryId and price), return the (whole) Brand document.

In order to retrieve only specific elements of this array, you should include your $elemMatch object in the projection step of your find call:

  const products = await Brand.find({
    _id: brandId 
    }, {
      //include other properties you want to include in your output document
      products: {
        $elemMatch: {
          categoryId: "62f3eaff3ded19dcce71081e",
          price: 240
        }
      }
    }
  })
  • Related