Try Studio 3T for Free
  1. Knowledge Base
  2. MongoDB Tutorials
  3. MongoDB $project Example | The MongoDB Aggregation Pipeline

MongoDB $project Example | The MongoDB Aggregation Pipeline

This is Stage 2 of a three-part aggregation query example that uses the $lookup, $project$out stages. Download Studio 3T to follow along the example.

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.

Two embedded documents, two 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


Use $project to filter down to the fields you need

$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

Download Studio 3T to access to 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.

Click on the green plus icon to add a new stage

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.

Stage output of the project stage

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

The resulting documents only show the fields we wanted to project

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.

mongo shell code with lookup and project stages

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.

Read next: Stage 3 – MongoDB $out stage

Updated on July 27, 2020

Was this article helpful?