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.
![The JSON document from the first part of the aggregation query example](https://studio3t.com/wp-content/uploads/2023/09/lookup-example-JSON-document-909x1024.png)
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
![Highlighting the fields we'll filter using $project](https://studio3t.com/wp-content/uploads/2023/10/project-example-JSON-document-909x1024.png)
$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.
Let’s add a new stage by clicking on Add stage.
Choose $project
in the Operator dropdown menu.
![Click Add stage and then select the $project operator](https://studio3t.com/wp-content/uploads/2023/10/project-example-add-project-stage-1024x406.png)
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, }
On the Stage input/output tab, click on the Run (play) button under Stage2: Output to run just this stage.
![](https://studio3t.com/wp-content/uploads/2023/10/project-example-paste-the-code-1024x713.png)
Or execute the entire pipeline by clicking on the Run button in the toolbar.
![The resulting documents only show the fields we wanted to project](https://studio3t.com/wp-content/uploads/2023/10/project-example-run-pipeline-1024x701.png)
The pipeline and stage outputs should now only show the fields we want.
$project
in mongo shell
To view the aggregation queries in mongo shell code, click on Query Code.
![mongo shell code with lookup and project stages](https://studio3t.com/wp-content/uploads/2023/10/project-example-mongo-shell-code-1024x710.png)
You can then open this query directly in IntelliShell by clicking on the Open in IntelliShell button.
![](https://studio3t.com/wp-content/uploads/2023/10/project-example-open-in-IntelliShell.png)
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.