Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-39487

Aggregation operator $sqrt output for NumberDecimal is the same as $exp

    XMLWordPrintable

    Details

    • Backwards Compatibility:
      Fully Compatible
    • Operating System:
      ALL
    • Backport Requested:
      v4.0, v3.6, v3.4
    • Sprint:
      Query 2019-02-25

      Description

      Using the following documents:

      db.test.insert({value:NumberDecimal("25")});
      db.test.insert({value:NumberDecimal(25)});
      

      Running aggregation operator $sqrt as below:

      db.test.aggregate([{
          "$addFields":{
              "sqrt": {"$sqrt": "$value"}, 
              "exp": {"$exp": "$value"}, 
          }
      }])
      

      Produces:

            {
              "_id": ObjectId("..."),
              "value": NumberDecimal("25"),
              "sqrt": NumberDecimal("72004899337.38587252416135146612616"),
              "exp": NumberDecimal("72004899337.38587252416135146612616")
            },
            {
              "_id": ObjectId("..."),
              "value": NumberDecimal("25.0000000000000"),
              "sqrt": NumberDecimal("72004899337.38587252416135146612616"),
              "exp": NumberDecimal("72004899337.38587252416135146612616")
            }
      

      Note that the output of the $sqrt is the same as the output of $exp.
      Looking at the code, the method Decimal128::squareRoot is exactly the same as Decimal128::exponential :

      Decimal128::squareRoot:
      https://github.com/mongodb/mongo/blob/r4.1.6/src/mongo/platform/decimal128.cpp#L720

      Decimal128::exponential:
      https://github.com/mongodb/mongo/blob/r4.1.6/src/mongo/platform/decimal128.cpp#L627

      A workaround is to convert the decimal to double first i.e. $toDouble, to bypass the squareRoot method call in expression: https://github.com/mongodb/mongo/blob/r4.1.6/src/mongo/db/pipeline/expression.cpp#L4091

      For example:

      db.test.aggregate([{
          "$addFields":{
              "sqrt": {"$sqrt": {"$toDouble":"$value"}}, 
              "exp": {"$exp": "$value"}, 
          }
      }])
      

        Attachments

          Activity

            People

            • Votes:
              0 Vote for this issue
              Watchers:
              16 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: