DEV Community

Cover image for MongoDB Aggregation Pipeline - $function Stage
Shubham Dutta
Shubham Dutta

Posted on β€’ Edited on

2 1 1

MongoDB Aggregation Pipeline - $function Stage

An Overview

A popular NoSQL database called MongoDB offers a scalable and adaptable option for storing and handling enormous amounts of data. The aggregation pipeline, which enables users to carry out complex data analysis and manipulation, is one of MongoDB's core features. The $function stage of the MongoDB aggregation pipeline and its use cases will be the main topic of this blog.


What is the $function Stage in MongoDB Aggregation Pipeline?

The MongoDB aggregation pipeline has an additional stage called $function that enables users to write their own unique JavaScript functions for data processing. When there is no built-in stage that can carry out the needed operation, this stage is especially helpful. Users have access to the complete JavaScript runtime and the MongoDB aggregation framework because the $function stage is executed within the context of the MongoDB server.


Syntax:

The following syntax is used to define the $function stage:

{
  $function: {
    body: <code>,
    args: <array expression>,
    lang: "js"
  }
}
Enter fullscreen mode Exit fullscreen mode

The args field specifies an optional initial value that will be provided to the function, and the body field specifies the JavaScript function definition that will be performed. You can specify an empty array []. If the body function does not accept an argument. lang is The language used in the body need to specify lang: "js".


Use Cases for the $function Stage in MongoDB Aggregation Pipeline

  1. Running totals computation: The $function stage can compute running totals by storing the cumulative sum in the state object.

  2. Implement custom algorithms: Custom algorithms that cannot be implemented with the built-in stages can be implemented using the $function stage.

  3. Transforming Array: Arrays can be transformed by mapping, filtering, or reducing the items of the array using the $function stage.


Example:

Consider the following input document in the "customer" collection:

{
  "_id": 1,
  "name": "Shubham Dutta",
  "email": "shubham_dutta@gmail.com",
  "position": "Developer"
},

{
  "_id": 2,
  "name": "Arjun Dutta",
  "email": "arjun.dutta@gmail.com",
  "position": "Designer"
}
Enter fullscreen mode Exit fullscreen mode

Now, we need to separate out each customer's first name from their entire name and lowercase the position. The aggregate process listed below can be used to do this:

db.customers.aggregate([
  {
    $project: {
      'name': {
        $function: {
          body: function (name) {
            let firstName = name.split(" ")[0];
            return firstName;
          },
          args: {"$name"},
          lang: "js",
        },
      },
      'position': {
        $function: {
          body: function (position) {
            let position = position.toLowerCase();
            return position;
          },
          args: {"$position"},
          lang: "js",
        },
      },
    },
    '_id': 0,
    'email': 1
  },
]);
Enter fullscreen mode Exit fullscreen mode

The following is the result of the above pipeline:

[
  {
    "name": "Shubham",
    "email": "shubham_dutta@gmail.com",
    "position": "Developer"
  },
  {
    "name": "Arjun",
    "email": "arjun.dutta@gmail.com",
    "position": "designer"
  }
]
Enter fullscreen mode Exit fullscreen mode

By splitting the name field on the space character and returning the first element of the resulting array, the first name of each customer is extracted from their entire name  using the $function stage in this example. The toLowerCase() method is used to change the position field's case to lowercase. Each customer's name, email address, and position are included in a new object that is returned by the function argument using $project.


Conclusion

The MongoDB aggregation pipeline has a significant feature called the $function stage that enables users to write unique JavaScript functions for data processing.

The $function stage gives you the freedom and power you need to design custom algorithms, manipulate arrays, or compute running totals.

You can fully utilize this feature and unleash the complete power of your MongoDB data by understanding the syntax and application of the $function stage.

SurveyJS custom survey software

JavaScript UI Libraries for Surveys and Forms

SurveyJS lets you build a JSON-based form management system that integrates with any backend, giving you full control over your data and no user limits. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more.

Learn more

Top comments (2)

Collapse
 
somsubhra1 profile image
Somsubhra Das β€’

Great article. Easy to understand!

Collapse
 
kira_zarathos_3dc482a0a02 profile image
Kira Zarathos β€’

Hello, Great article also I wanted to know if it’s possible to execute a async function inside $function which finds a data from different collection

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free β†’

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay