Das Aggregation-Pipeline-Framework von MongoDB enthält einen $round
-Operator und ein $trunc
Operator. Diese Operatoren führen ähnliche, aber unterschiedliche Aufgaben aus.
Definitionen
Sehen wir uns zunächst die Definitionen der einzelnen Operatoren an:
- Die
$round
Operator Runden eine Zahl zu einer ganzen Zahl oder zu einer bestimmten Dezimalstelle. - Der
$truncate
Operator kürzt eine Zahl zu einer ganzen Zahl oder zu einer bestimmten Dezimalstelle.
Grundsätzlich liegt der Unterschied in den Worten rund vs abschneiden .
In einigen Fällen geben beide Operatoren das gleiche Ergebnis zurück. In anderen Fällen werden ihre Ergebnisse abweichen. Das liegt daran, dass $round
Operator kann die Zahl je nach Wert aufrunden. Der $truncate
Der Operator rundet die Zahl nicht. Stattdessen wird es einfach abgeschnitten. Mit anderen Worten, es schneidet einfach die angegebene Zahl ab, während die restlichen Stellen unverändert bleiben.
Beispiel
Angenommen, wir haben eine Sammlung namens test
mit folgenden Dokumenten:
{ "_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, "data" : 8999.454 }
Folgendes passiert, wenn wir $round
anwenden und $truncate
zu diesen Dokumenten:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] },
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Ergebnis:
{ "data" : 0, "rounded" : 0, "truncated" : 0 } { "data" : 8, "rounded" : 8, "truncated" : 8 } { "data" : 0.5, "rounded" : 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 }
Wir können sehen, dass in einigen Fällen das Ergebnis dasselbe ist. Bei anderen ist es anders. Zum Beispiel, wenn der Eingabewert 0.9
ist , die $round
Operator rundet die Zahl auf 1
auf . Der $truncate
Operator hingegen entfernt einfach die .9
Teil, der ein Ergebnis von 0
erzeugt .
Negative Nachkommastellen
Beide Operatoren akzeptieren ein optionales zweites Argument. Wenn vorhanden, gibt dieses Argument die Anzahl der Dezimalstellen an, auf die die Zahl gerundet/gekürzt werden soll.
Die Bereitstellung dieses zweiten Arguments kann den Unterschied zwischen den beiden Operatoren weiter hervorheben.
Beispiel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] },
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Ergebnis:
{ "data" : 0, "rounded" : 0, "truncated" : 0 } { "data" : 8, "rounded" : 8, "truncated" : 8 } { "data" : 0.5, "rounded" : 0.5, "truncated" : 0.5 } { "data" : 0.9, "rounded" : 0.9, "truncated" : 0.9 } { "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 } { "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 }
Wieder können wir sehen, dass einige Ergebnisse identisch sind, während andere es nicht sind.
Negative Nachkommastellen
Beide Operatoren akzeptieren einen negativen Wert für das zweite Argument.
Beispiel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", -1 ] },
truncated: { $trunc: [ "$data", -1 ] }
}
}
]
)
Ergebnis:
{ "data" : 0, "rounded" : 0, "truncated" : 0 } { "data" : 8, "rounded" : 10, "truncated" : 0 } { "data" : 0.5, "rounded" : 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 }
Diesmal gibt es einen starken Kontrast zwischen den Ergebnissen der beiden Operatoren. Der $trunc
Operator erzeugte 0
für jedes Dokument, während $round
Der Operator gab verschiedene Werte zurück, von denen die meisten auf- oder abgerundet wurden.
$floor und $ceil
Zwei weitere Operatoren, die Sie beachten sollten, wenn Sie Operationen wie diese ausführen, sind $floor
und $ceil
. Diese Operatoren funktionieren ähnlich, aber etwas anders.
$floor
gibt den größten zurück Ganzzahl kleiner oder gleich der angegebenen Zahl$ceil
gibt den kleinsten zurück Ganzzahl größer oder gleich der angegebenen Zahl.