MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $toDecimal

Depuis MongoDB 4.0, vous pouvez utiliser le $toDecimal opérateur de pipeline d'agrégation pour convertir une valeur en nombre décimal.

La plupart des types peuvent être convertis en décimal, mais pas l'ObjectId.

Lorsque vous convertissez une valeur de date en nombre décimal, $toDecimal renvoie le nombre de millisecondes depuis l'époque qui correspond à la valeur de date.

Lorsque vous convertissez un booléen en décimal, si le booléen est true , alors la décimale est 1 . Si le booléen est false , alors la décimale est 0 .

Exemple

Supposons que nous ayons une collection appelée types et il contient les documents suivants :

{
	"_id" : ObjectId("601340eac8eb4369cf6ad9db"),
	"double" : 123.75,
	"string" : "123",
	"boolean" : true,
	"date" : ISODate("2020-12-31T23:30:15.123Z"),
	"integer" : 123,
	"long" : NumberLong(123),
	"decimal" : NumberDecimal("123.75")
}

Nous pouvons utiliser le $toDecimal pour convertir ces types (à l'exception de l'ObjectId) en nombre décimal. Si l'entrée est déjà une décimale, elle renvoie simplement la décimale.

db.types.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          double: { $toDecimal: "$double" },
          string: { $toDecimal: "$string" },
          boolean: { $toDecimal: "$boolean" },
          date: { $toDecimal: "$date" },
          integer: { $toDecimal: "$integer" },
          long: { $toDecimal: "$long" },
          decimal: { $toDecimal: "$decimal" }
        }
    }
  ]
).pretty()

Résultat :

{
	"double" : NumberDecimal("123.750000000000"),
	"string" : NumberDecimal("123"),
	"boolean" : NumberDecimal("1"),
	"date" : NumberDecimal("1609457415123"),
	"integer" : NumberDecimal("123.000000000000"),
	"long" : NumberDecimal("123"),
	"decimal" : NumberDecimal("123.75")
}

Erreurs

Si vous rencontrez des erreurs, essayez d'utiliser le $convert opérateur au lieu de $toDecimal . Le $convert vous permet de gérer les erreurs sans affecter l'ensemble de l'opération d'agrégation.

Le $toDecimal est l'équivalent d'utiliser le $convert opérateur pour convertir une valeur en nombre décimal.

Voici un exemple d'utilisation de $convert pour essayer de convertir un ObjectId en décimal (ce qui génère une erreur) :

db.types.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
)

Résultat :

{ "result" : "An error occurred" } 

Utiliser $convert nous a permis de spécifier le message d'erreur à utiliser lorsque l'erreur s'est produite, et cela n'a pas interrompu l'ensemble de l'opération d'agrégation.

Voir MongoDB $convert pour plus d'exemples.