V MongoDB, $trunc
Operátor agregačního kanálu zkrátí číslo na celé číslo nebo na zadané desetinné místo.
Máte možnost určit, na kolik desetinných míst se má číslo zkrátit. Chcete-li to provést, předejte druhý argument. První argument je číslo, které se má zkrátit, a druhý (nepovinný) argument je počet desetinných míst, na která se má zkrátit.
Vynecháním druhého argumentu se zkrátí všechny číslice napravo od desetinné čárky a vrátí se celá celočíselná hodnota.
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 }
Můžeme použít $trunc
operátor pro zkrácení hodnot v data
pole:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Výsledek:
{ "data" : 8.99, "truncated" : 8 } { "data" : 8.45, "truncated" : 8 } { "data" : 8.451, "truncated" : 8 } { "data" : -8.99, "truncated" : -8 } { "data" : -8.45, "truncated" : -8 } { "data" : -8.451, "truncated" : -8 } { "data" : 8, "truncated" : 8 } { "data" : 0, "truncated" : 0 }
Všimněte si, že $trunc
nezaokrouhluje čísla jako $round
dělá. $trunc
operátor jednoduše zkrátí číslo. Pokud bychom použili $round
v této kolekci by první a čtvrtý dokument byly zaokrouhleny na 9
a -9
respektive.
Zadejte desetinné místo
Máme možnost použít druhý argument k určení, na kolik desetinných míst se má číslo zkrátit.
Příklad:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Výsledek:
{ "data" : 8.99, "truncated" : 8.9 } { "data" : 8.45, "truncated" : 8.4 } { "data" : 8.451, "truncated" : 8.4 } { "data" : -8.99, "truncated" : -8.9 } { "data" : -8.45, "truncated" : -8.4 } { "data" : -8.451, "truncated" : -8.4 } { "data" : 8, "truncated" : 8 } { "data" : 0, "truncated" : 0 }
Opět to jednoduše zkrátí číslo. Pokud bychom použili $round
, zaokrouhlovalo by to některá z těchto čísel.
Záporná desetinná místa
Druhým argumentem může být jakýkoli platný výraz, který se překládá na celé číslo mezi -20 a 100, s výjimkou. Proto můžete zadat záporné desetinné místo.
Když to uděláte, číslo se ořízne vlevo od desetinného místa. Pokud je absolutní hodnota záporného celého čísla větší než počet číslic nalevo od desetinné čárky, výsledek je 0
.
Předpokládejme, že do naší sbírky přidáme následující dokumenty:
{ "_id" : 9, "data" : 8111.32 } { "_id" : 10, "data" : 8514.321 } { "_id" : 11, "data" : 8999.454 }
Zde je příklad použití různých záporných desetinných míst při použití $trunc
k těm dokumentům:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 9, 10, 11 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $trunc: [ "$data", -1 ] },
b: { $trunc: [ "$data", -2 ] },
c: { $trunc: [ "$data", -3 ] },
d: { $trunc: [ "$data", -4 ] },
e: { $trunc: [ "$data", -5 ] }
}
}
]
).pretty()
Výsledek:
{ "data" : 8111.32, "a" : 8110, "b" : 8100, "c" : 8000, "d" : 0, "e" : 0 } { "data" : 8514.321, "a" : 8510, "b" : 8500, "c" : 8000, "d" : 0, "e" : 0 } { "data" : 8999.454, "a" : 8990, "b" : 8900, "c" : 8000, "d" : 0, "e" : 0 }
Desetinné místo od nuly
Když zadáte desetinné místo 0
, $trunc
operátor zkrátí všechny číslice napravo od desetinné čárky a vrátí celou hodnotu celého čísla.
Příklad:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 0 ] }
}
}
]
)
Výsledek:
{ "data" : 8.99, "truncated" : 8 } { "data" : 8.45, "truncated" : 8 } { "data" : 8.451, "truncated" : 8 } { "data" : -8.99, "truncated" : -8 } { "data" : -8.45, "truncated" : -8 } { "data" : -8.451, "truncated" : -8 } { "data" : 8, "truncated" : 8 } { "data" : 0, "truncated" : 0 } { "data" : 8111.32, "truncated" : 8111 } { "data" : 8514.321, "truncated" : 8514 } { "data" : 8999.454, "truncated" : 8999 }
Typy čísel
Číslo ke zkrácení může být jakýkoli platný výraz, který se překládá na celé číslo, dvojité, desetinné nebo dlouhé číslo. Vrácená hodnota odpovídá datovému typu vstupní hodnoty.
Pokud tedy do naší sbírky přidáme následující dokumenty:
{ "_id" : 12, "data" : NumberDecimal("128.4585") } { "_id" : 13, "data" : NumberDecimal("128.12345678912") }
Můžeme použít $trunc
na data
pole:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 12, 13 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $trunc: [ "$data", -1 ] },
b: { $trunc: [ "$data", 0 ] },
c: { $trunc: [ "$data", 3 ] },
d: { $trunc: [ "$data", 4 ] },
e: { $trunc: [ "$data", 5 ] }
}
}
]
).pretty()
Výsledek:
{ "data" : NumberDecimal("128.4585"), "a" : NumberDecimal("1.2E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.458"), "d" : NumberDecimal("128.4585"), "e" : NumberDecimal("128.45850") } { "data" : NumberDecimal("128.12345678912"), "a" : NumberDecimal("1.2E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.123"), "d" : NumberDecimal("128.1234"), "e" : NumberDecimal("128.12345") }
Zkrácení na nulová desetinná místa
Pokud je druhý argument null
, výsledkem je null
.
Příklad:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", null ] }
}
}
]
)
Výsledek:
{ "data" : 8.99, "truncated" : null } { "data" : 8.45, "truncated" : null } { "data" : 8.451, "truncated" : null }
Zkrácení hodnoty Null
Pokud je hodnota, která má být zkrácena, null
, výsledkem je null
.
Předpokládejme, že do sbírky přidáme následující dokument:
{ "_id" : 14, "data" : null }
A my používáme $trunc
pro zkrácení hodnoty null:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 14 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", null ] }
}
}
]
)
Výsledek:
{ "data" : null, "truncated" : null }
Zkrácení nekonečna
Pokud je číslo, které má být zkráceno, Infinity
, výsledkem je Infinity
. Podobně, pokud je to -Infinity
, výsledkem je -Infinity
.
Přidejme dva dokumenty s takovými hodnotami:
{ "_id" : 15, "data" : Infinity } { "_id" : 16, "data" : -Infinity }
A pojďme je zkrátit:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 15, 16 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 2 ] }
}
}
]
)
Výsledek:
{ "data" : Infinity, "truncated" : Infinity } { "data" : -Infinity, "truncated" : -Infinity }
Zkrácení NaN
Zkracování NaN
výsledkem je NaN
.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" * 2 ] }
}
}
]
)
Výsledek:
{ "data" : 8.99, "truncated" : NaN } { "data" : 8.45, "truncated" : NaN }
Nečíselné typy
Pokud se pokusíte zkrátit hodnotu, která má nesprávný datový typ (tj. není to celé číslo, dvojité, desítkové nebo dlouhé číslo), vrátí se chyba.
Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" : 17, "data" : "Thirty five" }
A nyní se pokusíme zkrátit data
pole:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 17 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Výsledek:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$trunc only supports numeric types, not string", "code" : 51081, "codeName" : "Location51081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1