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

MongoDB $round vs $trunc :quelle est la différence ?

Le framework de pipeline d'agrégation de MongoDB inclut un $round opérateur et un $trunc opérateur. Ces opérateurs effectuent des tâches similaires, mais différentes.

Définitions

Voyons d'abord les définitions de chaque opérateur :

  • Le $round opérateur tours un nombre à un entier entier ou à une décimale spécifiée.
  • Le $truncate l'opérateur tronque un nombre à un entier entier ou à une décimale spécifiée.

Fondamentalement, la différence réside dans les mots rond vs tronquer .

Dans certains cas, les deux opérateurs renverront le même résultat. Dans d'autres cas, leurs résultats seront différents. C'est parce que le $round L'opérateur peut arrondir le nombre vers le haut, en fonction de la valeur. Le $truncate l'opérateur n'arrondit pas le nombre. Au lieu de cela, il le tronque simplement. En d'autres termes, il coupe simplement le nombre spécifié, tout en laissant les chiffres restants tels quels.

Exemple

Supposons que nous ayons une collection appelée test avec les documents suivants :

{ "_id" :1, "data" :8.99 }{ "_id" :2, "data" :8.45 }{ "_id" :3, "data" :8.451 }{ "_id" :4, " data" :-8.99 }{ "_id" :5, "data" :-8.45 }{ "_id" :6, "data" :-8.451 }{ "_id" :7, "data" :8 }{ "_id" " :8, "data" :0 }{ "_id" :9, "data" :0.5 }{ "_id" :10, "data" :8111.32 }{ "_id" :11, "data" :8514.321 }{ "_id" :12, "données" :8999.454 }

Voici ce qui se passe lorsque nous appliquons $round et $truncate à ces documents :

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data" ] },
            truncated: { $trunc: [ "$data" ] }
          }
     }
   ]
) 

Résultat :

{ "data" :0, "rounded" :0, "truncated" :0 }{ "data" :8, "rounded" :8, "truncated" :8 }{ "data" :0.5, "arrondi " :0, "truncated" :0 }{ "data" :0.9, "rounded" :1, "truncated" :0 }{ "data" :8.99, "rounded" :9, "truncated" :8 }{ " data" :8.45, "rounded" :8, "truncated" :8 }{ "data" :8.451, "rounded" :8, "truncated" :8 }{ "data" :-8.99, "rounded" :-9 , "truncated" :-8 }{ "data" :-8.45, "rounded" :-8, "truncated" :-8 }{ "data" :-8.451, "rounded" :-8, "truncated" :- 8 }

Nous pouvons voir que dans certains cas, le résultat est le même. Dans d'autres, c'est différent. Par exemple, lorsque la valeur d'entrée est 0.9 , le $round l'opérateur arrondit le nombre jusqu'à 1 . Le $truncate l'opérateur d'autre part supprime simplement le .9 partie, qui produit un résultat de 0 .

Lieux fractionnaires négatifs

Les deux opérateurs acceptent un deuxième argument facultatif. Lorsqu'il est présent, cet argument spécifie le nombre de décimales auxquelles arrondir/tronquer le nombre.

Fournir ce deuxième argument peut mettre davantage en évidence la différence entre les deux opérateurs.

Exemple :

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", 1 ] },
            truncated: { $trunc: [ "$data", 1 ] }
          }
     }
   ]
) 

Résultat :

{ "data" :0, "rounded" :0, "truncated" :0 }{ "data" :8, "rounded" :8, "truncated" :8 }{ "data" :0.5, "arrondi " :0.5, "tronqué" :0.5 }{ "données" :0.9, "arrondi" :0.9, "tronqué" :0.9 }{ "données" :8.99, "arrondi" :9, "tronqué" :8.9 }{ " data" :8.45, "rounded" :8.4, "truncated" :8.4 }{ "data" :8.451, "rounded" :8.5, "truncated" :8.4 }{ "data" :-8.99, "rounded" :-9 , "truncated" :-8.9 }{ "data" :-8.45, "rounded" :-8.4, "truncated" :-8.4 }{ "data" :-8.451, "rounded" :-8.5, "truncated" :- 8.4 }

Encore une fois, nous pouvons voir que certains résultats sont identiques tandis que d'autres ne le sont pas.

Lieux fractionnaires négatifs

Les deux opérateurs acceptent une valeur négative pour le second argument.

Exemple :

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", -1 ] },
            truncated: { $trunc: [ "$data", -1 ] }
          }
     }
   ]
) 

Résultat :

{ "data" :0, "rounded" :0, "truncated" :0 }{ "data" :8, "rounded" :10, "truncated" :0 }{ "data" :0.5, "arrondi " :0, "truncated" :0 }{ "data" :0.9, "rounded" :0, "truncated" :0 }{ "data" :8.99, "rounded" :10, "truncated" :0 }{ " data" :8.45, "rounded" :10, "truncated" :0 }{ "data" :8.451, "rounded" :10, "truncated" :0 }{ "data" :-8.99, "rounded" :-10 , "truncated" :0 }{ "data" :-8.45, "rounded" :-10, "truncated" :0 }{ "data" :-8.451, "rounded" :-10, "truncated" :0 } 

Cette fois, il y a un contraste frappant entre les résultats produits par les deux opérateurs. Le $trunc opérateur produit 0 pour chaque document, tandis que le $round l'opérateur a renvoyé diverses valeurs, dont la plupart ont été arrondies vers le haut ou vers le bas.

$plancher et $plafond

Deux autres opérateurs à connaître lors de l'exécution d'opérations comme celle-ci sont $floor et $ceil . Ces opérateurs fonctionnent de manière similaire, mais légèrement différente.

  • $floor renvoie le plus grand entier inférieur ou égal au nombre spécifié
  • $ceil renvoie le plus petit entier supérieur ou égal au nombre spécifié.