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.
Let’s add a new stage by clicking on Add stage.
Choose $project
in the Operator 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, }
On the Stage input/output tab, click on the Run (play) button under Stage2: Output to run just this stage.
Or execute the entire pipeline by clicking on the Run 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 queries in mongo shell code, click on Query Code.
You can then open 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.