I MongoDB, $trunc
aggregeringspipeline-operatör trunkerar ett tal till ett heltal eller till en angiven decimal.
Du har möjlighet att ange hur många decimaler som talet ska trunkeras för. För att göra detta, skicka ett andra argument. Det första argumentet är antalet som ska trunkeras, och det andra (valfria) argumentet är antalet decimaler som det ska trunkeras till.
Om det andra argumentet utelämnas trunkeras alla siffror till höger om decimalen och returnerar hela heltalsvärdet.
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 }
Vi kan använda $trunc
operatorn för att trunkera värdena i data
fält:
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 }
Lägg märke till att $trunc
avrundar inte siffror som $round
gör. $trunc
operatör trunkerar helt enkelt numret. Om vi hade tillämpat $round
till denna samling skulle det första och fjärde dokumentet ha avrundats till 9
och -9
respektive.
Ange en decimal
Vi har möjlighet att använda ett andra argument för att ange hur många decimaler som talet ska trunkeras till.
Exempel:
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 }
Återigen, detta avkortar helt enkelt numret. Om vi hade använt $round
, det skulle ha avrundat några av dessa siffror.
Negativa decimaler
Det andra argumentet kan vara vilket giltigt uttryck som helst som löser sig till ett heltal mellan -20 och 100, exklusivt. Därför kan du ange en negativ decimal.
När du gör detta, trunkeras talet till vänster om decimalen. Om det absoluta värdet för det negativa heltal är större antalet siffror till vänster om decimalen, blir resultatet 0
.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 9, "data" : 8111.32 } { "_id" : 10, "data" : 8514.321 } { "_id" : 11, "data" : 8999.454 }
Här är ett exempel på hur du använder olika negativa decimaler när du använder $trunc
till dessa dokument:
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 }
Noll decimal
När du anger en decimal på 0
, $trunc
operatorn trunkerar alla siffror till höger om decimalen och returnerar hela heltalsvärdet.
Exempel:
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 }
Nummertyper
Numret som ska trunkeras kan vara vilket giltigt uttryck som helst som löser sig till ett heltal, dubbelt, decimalt eller långt. Returvärdet matchar datatypen för inmatningsvärdet.
Så om vi lägger till följande dokument till vår samling:
{ "_id" : 12, "data" : NumberDecimal("128.4585") } { "_id" : 13, "data" : NumberDecimal("128.12345678912") }
Vi kan använda $trunc
till data
fält:
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") }
Trunkerar till nolldecimaler
Om det andra argumentet är null
, resultatet är null
.
Exempel:
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 }
Trunkera ett nollvärde
Om värdet som ska trunkeras är null
, resultatet är null
.
Anta att vi lägger till följande dokument i samlingen:
{ "_id" : 14, "data" : null }
Och vi använder $trunc
för att trunkera nullvärdet:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 14 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", null ] }
}
}
]
)
Resultat:
{ "data" : null, "truncated" : null }
Truncating Infinity
Om numret som ska trunkeras är Infinity
, resultatet är Infinity
. Likaså om det är -Infinity
, resultatet är -Infinity
.
Låt oss lägga till två dokument med sådana värden:
{ "_id" : 15, "data" : Infinity } { "_id" : 16, "data" : -Infinity }
Och låt oss trunkera 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 }
Trunkerar NaN
Trunkerar NaN
resulterar 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 }
Icke-numeriska typer
Om du försöker trunkera ett värde som är fel datatyp (dvs. det är inte ett heltal, dubbelt, decimalt eller långt), returneras ett fel.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 17, "data" : "Thirty five" }
Och nu försöker vi trunkera data
fält:
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