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:
$roundoperatør runder et tal til et helt heltal eller til en specificeret decimal.$truncateoperator 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.
$floorreturnerer den største heltal mindre end eller lig med det angivne tal$ceilreturnerer den mindste heltal større end eller lig med det angivne tal.