On this page
$project (aggregation)
On this page
Definition
$project-
Passes along the documents with the requested fields to the next stage in the pipeline. The specified fields can be existing fields from the input documents or newly computed fields.
The
$projectstage has the following prototype form:{ $project: { <specification(s)> } }The
$projecttakes a document that can specify the inclusion of fields, the suppression of the_idfield, the addition of new fields, and the resetting of the values of existing fields. Alternatively, you may specify the exclusion of fields.The
$projectspecifications have the following forms:Form Description <field>: <1 or true>Specifies the inclusion of a field. _id: <0 or false>Specifies the suppression of the
_idfield.To exclude a field conditionally, use the
REMOVEvariable instead. For details, see Exclude Fields Conditionally.<field>: <expression>Adds a new field or resets the value of an existing field.
Changed in version 3.6: MongoDB 3.6 adds the variable
REMOVE. If the the expression evaluates to$$REMOVE, the field is excluded in the output. For details, see Exclude Fields Conditionally.<field>:<0 or false>New in version 3.4.
Specifies the exclusion of a field.
To exclude a field conditionally, use the
REMOVEvariable instead. For details, see Exclude Fields Conditionally.If you specify the exclusion of a field other than
_id, you cannot employ any other$projectspecification forms. This restriction does not apply to conditionally exclusion of a field using theREMOVEvariable.
Considerations
Include Existing Fields
- The
_idfield is, by default, included in the output documents. To include any other fields from the input documents in the output documents, you must explicitly specify the inclusion in$project. - If you specify an inclusion of a field that does not exist in the document,
$projectignores that field inclusion and does not add the field to the document.
Suppress the _id Field
By default, the _id field is included in the output documents. To exclude the _id field from the output documents, you must explicitly specify the suppression of the _id field in $project.
Exclude Fields
New in version 3.4.
If you specify the exclusion of a field or fields, all other fields are returned in the output documents.
If you specify the exclusion of a field other than _id, you cannot employ any other $project specification forms: i.e. if you exclude fields, you cannot also specify the inclusion of fields, reset the value of existing fields, or add new fields. This restriction does not apply to conditional exclusion of a field using the REMOVE variable.
Exclude Fields Conditionally
New in version 3.6.
Starting in MongoDB 3.6, you can use the variable REMOVE in aggregation expressions to conditionally suppress a field. For an example, see Conditionally Exclude Fields.
Add New Fields or Reset Existing Fields
Note
MongoDB also provides $addFields to add new fields to the documents.
To add a new field or to reset the value of an existing field, specify the field name and set its value to some expression. For more information on expressions, see Expressions.
Literal Values
To set a field value directly to a numeric or boolean literal, as opposed to setting the field to an expression that resolves to a literal, use the $literal operator. Otherwise, $project treats the numeric or boolean literal as a flag for including or excluding the field.
Field Rename
By specifying a new field and setting its value to the field path of an existing field, you can effectively rename a field.
New Array Fields
Starting in MongoDB 3.2, $project stage supports using the square brackets [] to directly create new array fields. If array specification includes fields that are non-existent in a document, the operation substitutes null as the value for that field. For an example, see Project New Array Fields.
Embedded Document Fields
When projecting or adding/resetting a field within an embedded document, you can either use dot notation, as in
"contact.address.country": <1 or 0 or expression>
Or you can nest the fields:
contact: { address: { country: <1 or 0 or expression> } }
When nesting the fields, you cannot use dot notation inside the embedded document to specify the field, e.g. contact: { "address.country": <1 or 0 or expression> } is invalid.
Restrictions
Changed in version 3.4.
MongoDB 3.4 and later produces an error if the $project specification is an empty document.
Examples
Include Specific Fields in Output Documents
Consider a books collection with the following document:
{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5
}
The following $project stage includes only the _id, title, and the author fields in its output documents:
db.books.aggregate( [ { $project : { title : 1 , author : 1 } } ] )
The operation results in the following document:
{ "_id" : 1, "title" : "abc123", "author" : { "last" : "zzz", "first" : "aaa" } }
Suppress _id Field in the Output Documents
The _id field is always included by default. To exclude the _id field from the output documents of the $project stage, specify the exclusion of the _id field by setting it to 0 in the projection document.
Consider a books collection with the following document:
{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5
}
The following $project stage excludes the _id field but includes the title, and the author fields in its output documents:
db.books.aggregate( [ { $project : { _id: 0, title : 1 , author : 1 } } ] )
The operation results in the following document:
{ "title" : "abc123", "author" : { "last" : "zzz", "first" : "aaa" } }
Exclude Fields from Output Documents
New in version 3.4.
Consider a books collection with the following document:
{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5,
lastModified: "2016-07-28"
}
The following $project stage excludes the lastModified field from the output:
db.books.aggregate( [ { $project : { "lastModified": 0 } } ] )
Exclude Fields from Embedded Documents
New in version 3.4.
Consider a books collection with the following document:
{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5,
lastModified: "2016-07-28"
}
The following $project stage excludes the author.first and lastModified fields from the output:
db.books.aggregate<