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 produit0
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é.