I MongoDB er $trunc
aggregeringspipeline-operatør trunkerer et tal til et helt heltal eller til en specificeret decimal.
Du har mulighed for at angive, hvor mange decimaler tallet skal afkortes for. For at gøre dette skal du sende et andet argument. Det første argument er antallet, der skal afkortes, og det andet (valgfrit) argument er antallet af decimaler, det skal afkortes til.
Udeladelse af det andet argument afkorter alle cifre til højre for decimalen og returnerer hele heltalsværdien.
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 }
Vi kan bruge $trunc
operator for at afkorte værdierne i data
felt:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Resultat:
{ "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 }
Bemærk at $trunc
afrunder ikke tal som $round
gør. $trunc
operatør afkorter simpelthen nummeret. Hvis vi havde anvendt $round
til denne samling ville det første og det fjerde dokument være blevet afrundet til 9
og -9
hhv.
Angiv en decimal
Vi har mulighed for at bruge et andet argument til at angive, hvor mange decimaler tallet skal afkortes til.
Eksempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Resultat:
{ "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 }
Igen, dette afkorter simpelthen tallet. Hvis vi havde brugt $round
, ville det have rundet nogle af disse tal.
Negative decimaler
Det andet argument kan være et hvilket som helst gyldigt udtryk, der løses til et heltal mellem -20 og 100, eksklusivt. Derfor kan du angive en negativ decimal.
Når du gør dette, afkortes tallet til venstre for decimalen. Hvis den absolutte værdi af det negative heltal er større end antallet af cifre til venstre for decimalen, er resultatet 0
.
Antag, at vi føjer følgende dokumenter til vores samling:
{ "_id" : 9, "data" : 8111.32 } { "_id" : 10, "data" : 8514.321 } { "_id" : 11, "data" : 8999.454 }
Her er et eksempel på brug af forskellige negative decimaler, når du anvender $trunc
til disse dokumenter:
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()
Resultat:
{ "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 }
Nul decimal
Når du angiver en decimal på 0
, $trunc
operatoren afkorter alle cifre til højre for decimalen og returnerer hele heltalsværdien.
Eksempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 0 ] }
}
}
]
)
Resultat:
{ "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 }
Taltyper
Tallet, der skal afkortes, kan være et hvilket som helst gyldigt udtryk, der opløses til et heltal, dobbelt, decimal eller langt. Returværdien matcher datatypen for inputværdien.
Så hvis vi tilføjer følgende dokumenter til vores samling:
{ "_id" : 12, "data" : NumberDecimal("128.4585") } { "_id" : 13, "data" : NumberDecimal("128.12345678912") }
Vi kan anvende $trunc
til data
felt:
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()
Resultat:
{ "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") }
Trunkering til nul decimaler
Hvis det andet argument er null
, resultatet er null
.
Eksempel:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", null ] }
}
}
]
)
Resultat:
{ "data" : 8.99, "truncated" : null } { "data" : 8.45, "truncated" : null } { "data" : 8.451, "truncated" : null }
Trunkering af en nulværdi
Hvis værdien, der skal afkortes, er null
, resultatet er null
.
Antag, at vi tilføjer følgende dokument til samlingen:
{ "_id" : 14, "data" : null }
Og vi bruger $trunc
for at afkorte null-værdien:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 14 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", null ] }
}
}
]
)
Resultat:
{ "data" : null, "truncated" : null }
Truncating Infinity
Hvis tallet, der skal afkortes, er Infinity
, resultatet er Infinity
. Ligeledes hvis det er -Infinity
, resultatet er -Infinity
.
Lad os tilføje to dokumenter med sådanne værdier:
{ "_id" : 15, "data" : Infinity } { "_id" : 16, "data" : -Infinity }
Og lad os afkorte dem:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 15, 16 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 2 ] }
}
}
]
)
Resultat:
{ "data" : Infinity, "truncated" : Infinity } { "data" : -Infinity, "truncated" : -Infinity }
Trunkering af NaN
Afkorter NaN
resulterer i NaN
.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" * 2 ] }
}
}
]
)
Resultat:
{ "data" : 8.99, "truncated" : NaN } { "data" : 8.45, "truncated" : NaN }
Ikke-numeriske typer
Hvis du forsøger at afkorte en værdi, der er den forkerte datatype (dvs. den ikke er et heltal, dobbelt, decimal eller lang), returneres en fejl.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" : 17, "data" : "Thirty five" }
Og nu prøver vi at afkorte data
felt:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 17 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Resultat:
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