MongoDBs aggregeringspipeline-ramme inkluderer en $round
operator og en $trunc
operatør. Disse operatører udfører lignende, men forskellige opgaver.
Definitioner
Lad os først se på definitionerne af hver operatør:
$round
operatør runder et tal til et helt heltal eller til en specificeret decimal.$truncate
operator trunkerer et tal til et helt heltal eller til en specificeret decimal.
Grundlæggende ligger forskellen i ordene rund vs truncate .
I nogle tilfælde vil begge operatører returnere det samme resultat. I andre tilfælde vil deres resultater afvige. Dette er fordi $round
operatør kan runde tallet op, afhængigt af værdien. $truncate
operatør runder ikke nummeret. I stedet afkorter den den simpelthen. Med andre ord klipper den simpelthen nummeret som angivet, mens de resterende cifre forbliver som de er.
Eksempel
Antag, at vi har en samling kaldet test
med følgende dokumenter:
{ "_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 }
Her er, hvad der sker, når vi anvender $round
og $truncate
til disse dokumenter:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] },
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Resultat:
{ "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 }
Vi kan se, at resultatet i nogle tilfælde er det samme. Hos andre er det anderledes. For eksempel når inputværdien er 0.9
, $round
operatør runder tallet op til 1
. $truncate
operatør på den anden side fjerner simpelthen .9
del, som producerer resultatet 0
.
Negative fraktionerede steder
Begge operatører accepterer et valgfrit andet argument. Når det er til stede, angiver dette argument antallet af decimaler, der skal afrundes/trunkeres tallet til.
Angivelse af dette andet argument kan yderligere fremhæve forskellen mellem de to operatører.
Eksempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] },
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Resultat:
{ "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 }
Igen kan vi se, at nogle resultater er identiske, mens andre ikke er det.
Negative fraktionerede steder
Begge operatorer accepterer en negativ værdi for det andet argument.
Eksempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", -1 ] },
truncated: { $trunc: [ "$data", -1 ] }
}
}
]
)
Resultat:
{ "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 }
Denne gang er der en skarp kontrast mellem resultaterne produceret af de to operatører. $trunc
operatør produceret 0
for hvert dokument, mens $round
operatør returnerede forskellige værdier, hvoraf de fleste var rundet op eller ned.
$gulv og $loft
Yderligere to operatører, du skal være opmærksom på, når du udfører operationer som denne, er $floor
og $ceil
. Disse operatører arbejder på samme måde, men lidt anderledes.
$floor
returnerer den største heltal mindre end eller lig med det angivne tal$ceil
returnerer den mindste heltal større end eller lig med det angivne tal.