MongoDB

MongoDB $Abs Operator

MongoDB $abs operator is one of the arithmetic expression operators that is deployed in the aggregation pipeline method. The absolute value result of a given number in the script is returned using the $abs operator. The absolute value implies that whether the integer is positive or negative, it always generates a positive value. The $abs operator gives the null value when the integer value is null. Additionally, the $abs operator also returns the null value if the input value corresponds to an empty field.

How Does the $Abs Operator Work in MongoDB

The $abs operator gives an output of the absolute value in MongoDB. Now, we have some following example cases to demonstrate the function of the $abs operator in MongoDB. We are working with the “StudentReport” collection where the following documents are inserted which shows the student with the result report and details about their fee structure. The three documents in the “StudentReport” collection are inserted by utilizing the insertMany() command of MongoDB.

db.StudentReport.insertMany([
      {
          "_id": 1,
          "Student": "Emily",
          "Mid-termMarks": 300,
          "Final-termMarks": 450,
          "TotalMarks": "1000",
          "StudentFees" : {"AdmissionFees": 50000,
                           "SemesterFees": 30000}
      },
      {
          "_id": 2,
          "Student": "Jenny",
          "Mid-termMarks": 400,
          "Final-termMarks": 490,
           "TotalMarks": "1000",
          "StudentFees" : {"AdmissionFees": 60000,
                           "SemesterFees": 35000}
      },
      {
          "_id": 3,
          "Student": "Lara",
          "Mid-termMarks": 399,
          "Final-termMarks": 500,
          "TotalMarks": "1000",
          "StudentFees" : {"AdmissionFees": 70000,
                           "SemesterFees": 50000}
      }

  ])

There, we have an output after inserting the documents in the “StudentReport” collection. Now, the $abs operator can be applied to the documents’ fields by following this operator’s syntax:

{ acknowledged: true, insertedIds: { '0': 1, '1': 2, '2': 3 } }

Example 1: Using the $Abs Operator

We use the $abs operator of MongoDB here to simply get the absolute value of the provided fields. The basic query of the $abs operator is given as follows:

db.StudentReport.aggregate([
    { $project: {
        "Mid-termMarks": { $abs: [ "$Mid-termMarks" ] },
        "Final-termMarks": { $abs: [ "$Final-termMarks" ] }}}
  ])

Here, we first deploy the aggregate method. Then, the $project is set. After that, we set the “Mid-termMarks” and “Final-termMarks” fields within the $project operator. Each field is assigned with the expression where the $abs operator is employed. The “Mid-termMarks” holds the “$abs: [ “$Mid-termMarks” ]” expression which gets the absolute value of the student mid-term marks from the $abs operator. Likewise, we apply the $abs operator to the second field which is “Final-termMarks”. Both these fields are set with the separate “$abs” operator to the individual absolute values that are obtained.

The absolute mid-term marks and the final-term marks are returned by the MongoDB $abs operator. Note that the absolute value from the $abs operator removes the negative sign if any field contains the negative sign in the document.

[
  { _id: 1, 'Mid-termMarks': 300, 'Final-termMarks': 450 },
  { _id: 2, 'Mid-termMarks': 400, 'Final-termMarks': 490 },
  { _id: 3, 'Mid-termMarks': 399, 'Final-termMarks': 500 }
]

Example 2: Using the $Abs Operator with the $Add Operator

The $abs operator can also be used with another operator in MongoDB. We use the $add operator within the $abs operator to add the values together. We can apply the arithmetic operator inside the $abs operator as it only accepts the numerical value. The command of the $abs operator along with the $add operator for additional purposes is displayed as follows:

db.StudentReport.aggregate([{$match: {Student: "Emily"}},
 {$project: {  
                Marks: {$abs:
                {$add: ["$Mid-termMarks", "$Final-termMarks"]}}}}])

Here, we first call the $project operator which is specified with the “Marks” field. The “Marks” field is assigned with the total marks which are returned by the $abs operator. Then, we provide the $abs operator expression – $abs: {$add: [“$Mid-termMarks”, “$Final-termMarks” – as we insert the “$add” operator which is further specified with the “$Mid-termMarks” and “$Final-termMarks” fields. The $add operator first adds the values of these set fields. Then, the additional results are assigned to the $abs operator. The $abs operator generates the absolute value in the output.

The result of the $abs operator by the $add operation is fetched here:

[ { _id: 1, Marks: 750 } ]

Example 3: Using the $Abs Operator with the $Subtract Operator

We can use the $add operator in the $abs operator for the addition operation. We can also use the $subtract operator to evaluate the magnitude difference among the specified fields from the documents. Instead of the $add operator, we apply the $subtract operator which can be seen in the following:

db.StudentReport.aggregate([
    { $match: { _id: 1 } },
    { $project: {
        "Mid-termMarks": 1,
        "Final-termMarks": 1,
        result: {
          $abs: { $subtract: [ "$Mid-termMarks", "$Final-termMarks" ] }
        }
      }
    }
  ]
)

Here, we match the document first using the $match operator. The $match operator searches the document whose “_id” field is “1”. Then, we set the $project operator where the “Mid-termMraks” and “final-termMarks” fields are assigned with a number “1” which indicates that these fields must be included in the output. After this, we have a “result” field which assigns the return value of the $abs operator. The $abs operator is applied where the $subtract operator is set to get the difference from the marks which are provided to the “Mid-termMarks” and the “final-termMarks”.

The previous $abs operator command of the “_id:1” document has the following output:

[
  { _id: 1, 'Mid-termMarks': 300, 'Final-termMarks': 450, result: 150 }
]

Example 4: Using the $Abs Operator within the Embedded Document

Next, we set the $abs operator for the embedded document that functions the same as the previous example. Let’s consider another query of the $abs operator in the following demonstration:

db.StudentReport.aggregate([  
   {$match : {Student : "Lara"}},  
         {  
            $project :  
                    {  
                        Student : 1,      
                        StudentFees : {$abs : {$add : [  
                        "$StudentFees.AdmissionFees", "$StudentFees.SemesterFees" ] }}}}  
 ])

Here, we match the document where the “Student” field has the “Lara” value. Then, we include the “Student” field in the output by assigning it with a value of “1” in the $project. The $project is set with the $abs operator on the embedded “StudentFees” field. The $abs operator gives the amount of the total fees by adding the values of the embedded fields – “AdmissionFees” and “SemesterFees”.

The following are the total fees that we get from the $abs operator:

[ { _id: 3, Student: 'Lara', StudentFees: 120000 } ]

Example 5: Using the $Abs Operator for NaN Values

When the value that is provided to the $operator is not a numeric datatype or an undefined value, the “NaN” value is raised. We have a given example query where the $abs operator generates the resultant value as “NaN”:

db.StudentReport.aggregate([
    { $match: { _id: 3 } },
    { $project: {
        "_id": 1,
        "Mid-termMarks": { $abs: [ "$Mid-termMarks" ] },
        "Final-termMarks": { $abs: [ 1 * "s" ] }
      }
    }
  ])

Here, we search for the document which contains the “id” value “3”. After searching, we deploy the $project operator where the “Mid-termMarks” is provided with the $abs operator to give the absolute value. Then, we set the $abs operator in the “Final-termMarks” where the $abs operator works on the numeric value of “1” which is multiplied by the string value of “s”.

The outcome displays the absolute value for the “Mid-termMarks” field and the NaN value for the “Final-termMarks”.

[ { _id: 3, 'Mid-termMarks': 399, 'Final-termMarks': NaN } ]

Conclusion

The article is about the working of the $abs operator in MongoDB. We can determine the absolute value through the use of the $abs operator. The $abs operator along with its different example implementation is demonstrated in this article. We used the $abs operator with the embedded fields of the document. Then, we combined the different arithmetic operators within the $abs operator. Furthermore, the $abs operator takes the NaN argument values which returned the NaN result in the output.

About the author

Saeed Raza

Hello geeks! I am here to guide you about your tech-related issues. My expertise revolves around Linux, Databases & Programming. Additionally, I am practicing law in Pakistan. Cheers to all of you.