MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $round vs. $trunc:Was ist der Unterschied?

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.