Rámec agregačního kanálu MongoDB obsahuje $round
operátor a $trunc
operátor. Tito operátoři vykonávají podobné, ale odlišné úkoly.
Definice
Nejprve se podívejme na definice jednotlivých operátorů:
$round
operátor koly číslo na celé celé číslo nebo na zadané desetinné místo.$truncate
operátor zkrátí číslo na celé celé číslo nebo na zadané desetinné místo.
V podstatě je rozdíl ve slovech kulatý vs zkrátit .
V některých případech oba operátoři vrátí stejný výsledek. V ostatních případech se jejich výsledky budou lišit. Je to proto, že $round
operátor může zaokrouhlit číslo nahoru v závislosti na hodnotě. $truncate
operátor číslo nezaokrouhluje. Místo toho jej jednoduše zkrátí. Jinými slovy, jednoduše ořízne číslo, jak je zadáno, a zbývající číslice ponechá tak, jak jsou.
Příklad
Předpokládejme, že máme kolekci nazvanou test
s následujícími dokumenty:
{ "_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 }
Zde je to, co se stane, když použijeme $round
a $truncate
k těm dokumentům:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] },
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Výsledek:
{ "data" :0, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :0,5, "zaokrouhleno" " :0, "zkráceno" :0 }{ "data" :0,9, "zaokrouhleno" :1, "zkráceno" :0 }{ "data" :8,99, "zaokrouhleno" :9, "zkráceno" :8 }{ " data" :8,45, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :8,451, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :-8,99, "zaokrouhleno" :-9 , "zkráceno" :-8 }{ "data" :-8,45, "zaokrouhleno" :-8, "zkráceno" :-8 }{ "data" :-8,451, "zaokrouhleno" :-8, "zkráceno" :- 8 }
Vidíme, že v některých případech je výsledek stejný. V jiných je to jinak. Například, když je vstupní hodnota 0.9
, $round
operátor zaokrouhlí číslo nahoru na 1
. $truncate
operátor na druhé straně jednoduše odstraní .9
část, která vytváří výsledek 0
.
Místa se zápornými zlomky
Oba operátory přijímají volitelný druhý argument. Je-li přítomen, tento argument určuje počet desetinných míst, na která se má číslo zaokrouhlit/zkrátit.
Uvedení tohoto druhého argumentu může dále zvýraznit rozdíl mezi těmito dvěma operátory.
Příklad:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] },
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Výsledek:
{ "data" :0, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :0,5, "zaokrouhleno" " :0,5, "zkráceno" :0,5 }{ "data" :0,9, "zaokrouhleno" :0,9, "zkráceno" :0,9 }{ "data" :8,99, "zaokrouhleno" :9, "zkráceno" :8,9 }{ " data" :8,45, "zaokrouhleno" :8,4, "zkráceno" :8,4 }{ "data" :8,451, "zaokrouhleno" :8,5, "zkráceno" :8,4 }{ "data" :-8,99, "zaokrouhleno" :-9 , "zkráceno" :-8,9 }{ "data" :-8,45, "zaokrouhleno" :-8,4, "zkráceno" :-8,4 }{ "data" :-8,451, "zaokrouhleno" :-8,5, "zkráceno" :- 8.4 }
Opět můžeme vidět, že některé výsledky jsou identické, zatímco jiné ne.
Místa se zápornými zlomky
Oba operátory přijímají zápornou hodnotu pro druhý argument.
Příklad:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", -1 ] },
truncated: { $trunc: [ "$data", -1 ] }
}
}
]
)
Výsledek:
{ "data" :0, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8, "zaokrouhleno" :10, "zkráceno" :0 }{ "data" :0,5, "zaokrouhleno" " :0, "zkráceno" :0 }{ "data" :0,9, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8,99, "zaokrouhleno" :10, "zkráceno" :0 }{ " data" :8,45, "zaokrouhleno" :10, "zkráceno" :0 }{ "data" :8,451, "zaokrouhleno" :10, "zkráceno" :0 }{ "data" :-8,99, "zaokrouhleno" :-10 , "zkráceno" :0 }{ "data" :-8,45, "zaokrouhleno" :-10, "zkráceno" :0 }{ "data" :-8,451, "zaokrouhleno" :-10, "zkráceno" :0 }Tentokrát je mezi výsledky dosaženými těmito dvěma operátory ostrý kontrast.
$trunc
operátor vytvořil0
pro každý dokument, zatímco$round
operátor vrátil různé hodnoty, z nichž většina byla zaokrouhlena nahoru nebo dolů.$floor a $ceil
Další dva operátoři, na které je třeba dávat pozor při provádění operací, jako je tato, jsou
$floor
a$ceil
. Tito operátoři pracují podobným způsobem, ale mírně odlišným způsobem.
$floor
vrátí největší celé číslo menší nebo rovno zadanému číslu$ceil
vrátí nejmenší celé číslo větší nebo rovné zadanému číslu.