$elemMatch (projection)
See also
Definition
$elemMatch
- The
$elemMatch
operator limits the contents of an<array>
field from the query results to contain only the firstelement matching the$elemMatch
condition.
Usage Considerations
Both the $
operator and the $elemMatch
operator projectthe first matching element from an array based on a condition.
The $
operator projects the first matching array element from eachdocument in a collection based on some condition from the query statement.
The $elemMatch
projection operator takes an explicit conditionargument. This allows you to project based on a condition not in the query, orif you need to project based on multiple fields in the array’s embedded documents.See Array Field Limitations for an example.
db.collection.find()
operations on views do not support $elemMatch
projection operator.
- You cannot specify a
$text
query expression in an$elemMatch
.
Examples
The examples on the $elemMatch
projection operatorassumes a collection schools
with the following documents:
- {
- _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 },
- { name: "ruth", school: 102, age: 16 },
- ]
- }
Zipcode Search
The following find()
operationqueries for all documents where the value of the zipcode
field is 63109
. The $elemMatch
projectionreturns only the first matching element of the students
array where the school
field has a value of 102
:
- db.schools.find( { zipcode: "63109" },
- { students: { $elemMatch: { school: 102 } } } )
The operation returns the following documents that have zipcode
equal to 63109
and projects the students
array using$elemMatch
:
- { "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }
- { "_id" : 3 }
- { "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] }
- For the document with
_id
equal to1
, thestudents
array contains multiple elements with theschool
fieldequal to102
. However, the$elemMatch
projection returns only the first matching element from thearray. - The document with
_id
equal to3
does not contain thestudents
field in the result since no element in itsstudents
array matched the$elemMatch
condition.
$elemMatch with Multiple Fields
The $elemMatch
projection can specify criteria on multiplefields:
The following find()
operationqueries for all documents where the value of the zipcode
field is 63109
. The projection includes the firstmatching element of the students
array where the school
field has a value of 102
and the age
field is greaterthan 10
:
- db.schools.find( { zipcode: "63109" },
- { students: { $elemMatch: { school: 102, age: { $gt: 10} } } } )
The operation returns the three documents that have zipcode
equal to 63109
:
- { "_id" : 1, "students" : [ { "name" : "jess", "school" : 102, "age" : 11 } ] }
- { "_id" : 3 }
- { "_id" : 4, "students" : [ { "name" : "ruth", "school" : 102, "age" : 16 } ] }
The document with _id
equal to 3
does not contain the students
fieldsince no array element matched the $elemMatch
criteria.
See also
$ (projection)
operator