The $project
stage
Sometimes we need to do a bit of data clean-up in our collection.
Picking up from Stage 1 – our $lookup
example – we definitely don’t need all the fields about the customer or affordable housing options.

JSON document (feat. data we don’t need)
The $project
stage is extremely useful for filtering a document to show only the fields we need:
first
last
address.city
address.state
address.zip_code.affordable_housing_options.Property Type
address.zip_code.affordable_housing_options.Property Name
address.zip_code.affordable_housing_options.Units
address.zip_code.affordable_housing_options.Zip Code

$project
syntax
The $project
syntax is quite straightforward. We need to indicate 1
or true
as the value to include the field in our projection.
<field> : <1 or true>
The nature of an aggregation pipeline is to have multiple stages, so you will likely use $project
in tandem with other operators like $find
, $match
, or $lookup
.
$project
in Aggregation Editor
To illustrate how $project
works, let’s build off of our $lookup
stage example.
Do steps 1-4, then let’s add a new stage by clicking on the green plus icon. This will open a new stage tab called Stage 2.
Choose $project
in the dropdown menu.

Let’s paste the query:
{ "first" : 1.0, "last" : 1.0, "address.city" : 1.0, "address.state" : 1.0, "address.zip_code.affordable_housing_options.Property Type" : 1.0, "address.zip_code.affordable_housing_options.Property Name" : 1.0, "address.zip_code.affordable_housing_options.Units" : 1.0, "address.zip_code.affordable_housing_options.Zip Code" : 1.0, }
Click on the play button under Stage Output to execute just this stage.

Or execute the entire pipeline by clicking on the play button in the toolbar.

The pipeline and stage outputs should now only show the fields we want.
$project
in mongo shell
To view the aggregation query’s in mongo shell code, click on Query Code and choose mongo shell from the dropdown.

You can then run this query directly in IntelliShell by clicking on the Open in IntelliShell button.

Alternatively, you can paste the following query in IntelliShell, which should get you the same results:
db.getCollection("customers").aggregate( [ { "$lookup" : { "from" : "housing", "localField" : "address.zip_code", "foreignField" : "Zip Code", "as" : "address.zip_code.affordable_housing_options" } }, { "$project" : { "first" : 1.0, "last" : 1.0, "address.city" : 1.0, "address.state" : 1.0, "address.zip_code.affordable_housing_options.Property Type" : 1.0, "address.zip_code.affordable_housing_options.Property Name" : 1.0, "address.zip_code.affordable_housing_options.Units" : 1.0, "address.zip_code.affordable_housing_options.Zip Code" : 1.0 } } ], { "allowDiskUse" : false } );
Now, let’s add a third stage and save these output documents to a new collection using the $out
stage.