$project

The $project is a projection operator in MongoDB, which is used during the aggregation process to reshape/output a document by specifying the fields to include or exclude. This is particularly helpful when you need to limit the amount of data retrieved from the database or modify the structure of the result.

Using $project

The general syntax for the $project operator is:

{ $project: { field1: expression1, field2: expression2, ... } }

The key-value pairs within the $project operator specify the field names to be included in the final result, and their corresponding expressions help define how the output value would be computed.

Example

Let’s assume we have a “users” collection with documents that look like this:

{
  "_id": 1,
  "name": "John Doe",
  "posts": [
    { "title": "Sample Post 1", "views": 43 },
    { "title": "Sample Post 2", "views": 89 }
  ]
}

If you want to retrieve only the name and the total number of posts for each user, you can execute the following aggregate query with a $project operator:

db.users.aggregate([
  {
    $project: {
      name: 1,
      totalPosts: { $size: '$posts' },
    },
  },
]);

Here, we are including the name field and calculating the totalPosts value with the $size operator. The output will look like this:

{
  "_id": 1,
  "name": "John Doe",
  "totalPosts": 2
}

Excluding Fields

By default, using a field with a value of 0 (zero) within the $project operator will exclude all the other fields except for the specified ones. It’s important to note that the _id field is always included in the output unless explicitly excluded by specifying _id: 0.

For example, if you only want to exclude the “posts” field, you can do that as follows:

db.users.aggregate([
  {
    $project: {
      posts: 0,
    },
  },
]);

Conclusion

The $project operator is a powerful tool in MongoDB’s aggregation framework that helps you manage the shape and size of the output documents. By understanding and leveraging its capabilities, you can effectively optimize your queries and reduce the amount of unnecessary data transfer in your application.