I will use the example from here
{
_id: 1,
zipcode: 63109,
students: [
{ name: "john", school: 102, age: 10 },
{ name: "jess", school: 102, age: 11 },
{ name: "jeff", school: 108, age: 15 }
]
}
{
_id: 2,
zipcode: 63110,
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 3,
zipcode: 63109,
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 4,
zipcode: 63109,
students: [
{ name: "barney", school: 102, age: 7 },
]
}
If I run
db.schools.find( { zipcode: 63109 },
{ students: { $elemMatch: { school: 102 } } } )
It will give the first result of each array. Naming this:
{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }
{ "_id" : 3 }
{ "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] }
How can I make it return all the object of the array (and not only the first) that match the criteria? Meaning this:
{
_id: 1,
students: [
{ name: "john", school: 102, age: 10 },
{ name: "jess", school: 102, age: 11 }
]
}
{ _id: 3 }
{_id: 4, students: [ { name: "barney", school: 102, age: 7 }]}
In order to return multiple subdocuments, you're going to need to use the aggregation framework. This will return all of the subdocuments you're looking for:
You can do various things to get different output, but this will return:
Previous and incorrect answer:
This should work as of today. See https://docs.mongodb.com/v3.2/reference/operator/projection/positional/#array-field-limitationsYou should get the correct result when querying using
$elemMatch
in the query and exposing the sub-document in the projection like following:New answer
Limiting the list of sub-documents to those matching the query is as of now not possible using
find()
. Please takeaggregate()
instead or take one of the following possibilities:You could either get all the sub-documents of the matching document by adding the array-property in the projection:
Or you can get the first item matching the
$elemMatch
query on the sub-documents: