MongoDB:s aggregeringspipeline-ramverk inkluderar en $round
operator och en $trunc
operatör. Dessa operatörer utför liknande men olika uppgifter.
Definitioner
Låt oss först titta på definitionerna för varje operatör:
$round
operatör rundor ett tal till ett heltal eller till en angiven decimal.$truncate
operatorn trunkerar ett tal till ett heltal eller till en angiven decimal.
I grund och botten ligger skillnaden i orden runda kontra truncate .
I vissa fall kommer båda operatörerna att returnera samma resultat. I andra fall kommer deras resultat att skilja sig åt. Detta beror på att $round
operatören kan avrunda siffran uppåt, beroende på värdet. $truncate
operatören rundar inte av numret. Istället avkortar den den helt enkelt. Med andra ord, det klipper helt enkelt numret som specificerat, medan de återstående siffrorna lämnas som de är.
Exempel
Anta att vi har en samling som heter test
med följande dokument:
{ "_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 }
Det här är vad som händer när vi använder $round
och $truncate
till dessa dokument:
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 att i vissa fall blir resultatet detsamma. I andra är det annorlunda. Till exempel när inmatningsvärdet är 0.9
, $round
operatören avrundar talet uppåt till 1
. $truncate
operatorn å andra sidan tar helt enkelt bort .9
del, som ger resultatet 0
.
Negativa bråkdelar
Båda operatörerna accepterar ett valfritt andra argument. När det finns, anger detta argument antalet decimaler att avrunda/trunkera talet till.
Att tillhandahålla detta andra argument kan ytterligare markera skillnaden mellan de två operatorerna.
Exempel:
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 }
Återigen kan vi se att vissa resultat är identiska medan andra inte är det.
Negativa bråkdelar
Båda operatorerna accepterar ett negativt värde för det andra argumentet.
Exempel:
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 }
Den här gången finns det en skarp kontrast mellan resultaten som produceras av de två operatörerna. $trunc
operatören producerade 0
för varje dokument, medan $round
operatören returnerade olika värden, varav de flesta var avrundade uppåt eller nedåt.
$golv och $tak
Ytterligare två operatörer att vara medveten om när du utför operationer som denna är $floor
och $ceil
. Dessa operatörer fungerar på ett liknande sätt, men något annorlunda.
$floor
returnerar den största heltal mindre än eller lika med det angivna talet$ceil
returnerar den minsta heltal större än eller lika med det angivna talet.