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.