sql >> Database >  >> NoSQL >> MongoDB

MongoDB $round vs $trunc:wat is het verschil?

Het aggregatiepijplijnframework van MongoDB bevat een $round operator en een $trunc exploitant. Deze operators voeren vergelijkbare, maar verschillende taken uit.

Definities

Laten we eerst eens kijken naar de definities van elke operator:

  • De $round operator ronden een getal tot een geheel geheel getal of tot een gespecificeerde decimale plaats.
  • De $truncate operator kapt af een getal tot een geheel geheel getal of tot een gespecificeerde decimale plaats.

Eigenlijk zit het verschil in de woorden rond vs afkappen .

In sommige gevallen geven beide operators hetzelfde resultaat. In andere gevallen zullen hun resultaten verschillen. Dit komt omdat de $round operator kan het getal naar boven afronden, afhankelijk van de waarde. De $truncate operator rondt het getal niet af. In plaats daarvan wordt het gewoon afgekapt. Met andere woorden, het snijdt gewoon het nummer af zoals gespecificeerd, terwijl de resterende cijfers ongewijzigd blijven.

Voorbeeld

Stel dat we een verzameling hebben met de naam test met de volgende documenten:

{ "_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 }

Dit is wat er gebeurt als we $round toepassen en $truncate naar die documenten:

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

Resultaat:

{ "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 }

We kunnen zien dat in sommige gevallen het resultaat hetzelfde is. In andere is het anders. Als de invoerwaarde bijvoorbeeld 0.9 . is , de $round operator rondt het getal naar boven af ​​op 1 . De $truncate operator aan de andere kant verwijdert gewoon de .9 part, dat een resultaat geeft van 0 .

Negatieve fractionele plaatsen

Beide operators accepteren een optioneel tweede argument. Indien aanwezig, specificeert dit argument het aantal decimalen waarop het getal moet worden afgerond/afgekapt.

Het verstrekken van dit tweede argument kan het verschil tussen de twee operators nog meer benadrukken.

Voorbeeld:

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

Resultaat:

{ "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 }

Wederom kunnen we zien dat sommige resultaten identiek zijn en andere niet.

Negatieve fractionele plaatsen

Beide operatoren accepteren een negatieve waarde voor het tweede argument.

Voorbeeld:

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

Resultaat:

{ "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 }

Deze keer is er een schril contrast tussen de resultaten van de twee operators. De $trunc operator produceerde 0 voor elk document, terwijl de $round operator heeft verschillende waarden geretourneerd, waarvan de meeste naar boven of naar beneden zijn afgerond.

$floor en $ceil

Nog twee operators waar u op moet letten bij het uitvoeren van dergelijke bewerkingen zijn $floor en $ceil . Deze operators werken op een vergelijkbare manier, maar iets anders.

  • $floor geeft de grootste . terug geheel getal kleiner dan of gelijk aan het opgegeven getal
  • $ceil geeft de kleinste . terug geheel getal groter dan of gelijk aan het opgegeven getal.

  1. MySQL Master-Slave-replicatie instellen op Ubuntu 18.04

  2. nginx uwsgi websockets 502 Slechte gateway upstream voortijdig gesloten verbinding tijdens het lezen van responsheader van upstream

  3. Voortschrijdende gemiddelden met het aggregatieraamwerk van MongoDB?

  4. Schijfgebruik van een Docker-container analyseren