I MongoDB, $round
aggregeringspipeline-operatör avrundar ett tal till ett heltal eller till en angiven decimal.
Du har möjlighet att ange hur många decimaler som talet ska avrundas till. För att göra detta, skicka ett andra argument. Det första argumentet är talet som ska avrundas, och det andra (valfritt) argumentet är antalet decimaler som det ska avrundas till.
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 $round
operatorn för att runda av värdena i data
fält:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] }
}
}
]
)
Resultat:
{ "data" : 8.99, "rounded" : 9 } { "data" : 8.45, "rounded" : 8 } { "data" : 8.451, "rounded" : 8 } { "data" : -8.99, "rounded" : -9 } { "data" : -8.45, "rounded" : -8 } { "data" : -8.451, "rounded" : -8 } { "data" : 8, "rounded" : 8 } { "data" : 0, "rounded" : 0 }
Ange en decimal
Vi har möjlighet att använda ett andra argument för att ange hur många decimaler som talet ska avrundas till.
Exempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] }
}
}
]
)
Resultat:
{ "data" : 8.99, "rounded" : 9 } { "data" : 8.45, "rounded" : 8.4 } { "data" : 8.451, "rounded" : 8.5 } { "data" : -8.99, "rounded" : -9 } { "data" : -8.45, "rounded" : -8.4 } { "data" : -8.451, "rounded" : -8.5 } { "data" : 8, "rounded" : 8 } { "data" : 0, "rounded" : 0 }
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 avrundas talet till vänster om decimalen. Om det absoluta värdet för det negativa heltal är större än talet 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 $round
till dessa dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 9, 10, 11 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $round: [ "$data", -1 ] },
b: { $round: [ "$data", -2 ] },
c: { $round: [ "$data", -3 ] },
d: { $round: [ "$data", -4 ] },
e: { $round: [ "$data", -5 ] }
}
}
]
).pretty()
Resultat:
{ "data" : 8111.32, "a" : 8110, "b" : 8100, "c" : 8000, "d" : 10000, "e" : 0 } { "data" : 8514.321, "a" : 8510, "b" : 8500, "c" : 9000, "d" : 10000, "e" : 0 } { "data" : 8999.454, "a" : 9000, "b" : 9000, "c" : 9000, "d" : 10000, "e" : 0 }
Noll decimal
När du anger en decimal på 0
, $round
operatorn avrundar med den första siffran till höger om decimalen och returnerar det avrundade heltalsvärdet.
Exempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 0 ] }
}
}
]
)
Resultat:
{ "data" : 8.99, "rounded" : 9 } { "data" : 8.45, "rounded" : 8 } { "data" : 8.451, "rounded" : 8 } { "data" : -8.99, "rounded" : -9 } { "data" : -8.45, "rounded" : -8 } { "data" : -8.451, "rounded" : -8 } { "data" : 8, "rounded" : 8 } { "data" : 0, "rounded" : 0 } { "data" : 8111.32, "rounded" : 8111 } { "data" : 8514.321, "rounded" : 8514 } { "data" : 8999.454, "rounded" : 8999 }
Nummertyper
Antalet som ska avrundas kan vara vilket giltigt uttryck som helst som löser sig till ett heltal, dubbel, decimal eller lång. 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 tillämpa $round
till data
fält:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 12, 13 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $round: [ "$data", -1 ] },
b: { $round: [ "$data", 0 ] },
c: { $round: [ "$data", 3 ] },
d: { $round: [ "$data", 4 ] },
e: { $round: [ "$data", 5 ] }
}
}
]
).pretty()
Resultat:
{ "data" : NumberDecimal("128.4585"), "a" : NumberDecimal("1.3E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.458"), "d" : NumberDecimal("128.4585"), "e" : NumberDecimal("128.45850") } { "data" : NumberDecimal("128.12345678912"), "a" : NumberDecimal("1.3E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.123"), "d" : NumberDecimal("128.1235"), "e" : NumberDecimal("128.12346") }
Avrundning 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,
rounded: { $round: [ "$data", null ] }
}
}
]
)
Resultat:
{ "data" : 8.99, "rounded" : null } { "data" : 8.45, "rounded" : null } { "data" : 8.451, "rounded" : null }
Avrunda ett nollvärde
Om värdet som ska avrundas är null
, resultatet är null
.
Anta att vi lägger till följande dokument i samlingen:
{ "_id" : 14, "data" : null }
Och vi använder $round
för att avrunda nollvärdet:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 14 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", null ] }
}
}
]
)
Resultat:
{ "data" : null, "rounded" : null }
Avrunda oändlighet
Om talet som ska avrundas ä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 runda dem:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 15, 16 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 2 ] }
}
}
]
)
Resultat:
{ "data" : Infinity, "rounded" : Infinity } { "data" : -Infinity, "rounded" : -Infinity }
Avrundning av NaN
Avrundning NaN
resulterar i NaN
.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" * 2 ] }
}
}
]
)
Resultat:
{ "data" : 8.99, "rounded" : NaN } { "data" : 8.45, "rounded" : NaN }
Icke-numeriska typer
Om du försöker avrunda 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 runda data
fält:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 17 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] }
}
}
]
)
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$round 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