A estrutura de pipeline de agregação do MongoDB inclui um
$round
operador e um $trunc
operador. Esses operadores executam tarefas semelhantes, mas diferentes. Definições
Primeiro, vamos ver as definições de cada operador:
- A
$round
operador rodadas um número para um inteiro inteiro ou para uma casa decimal especificada. - O
$truncate
operador trunca um número para um inteiro inteiro ou para uma casa decimal especificada.
Basicamente, a diferença está nas palavras round vs truncar .
Em alguns casos, ambos os operadores retornarão o mesmo resultado. Em outros casos, seus resultados serão diferentes. Isso ocorre porque o
$round
operador pode arredondar o número para cima, dependendo do valor. O $truncate
operador não arredonda o número. Em vez disso, ele simplesmente o trunca. Em outras palavras, ele simplesmente corta o número conforme especificado, deixando os dígitos restantes como estão. Exemplo
Suponha que tenhamos uma coleção chamada
test
com os seguintes documentos:{ "_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, "dados" :8999.454 }
Veja o que acontece quando aplicamos
$round
e $truncate
a esses documentos:db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] },
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Resultado:
{ "dados" :0, "arredondado" :0, "truncado" :0 }{ "dados" :8, "arredondado" :8, "truncado" :8 }{ "dados" :0.5, "arredondado " :0, "truncado" :0 }{ "dados" :0,9, "arredondado" :1, "truncado" :0 }{ "dados" :8,99, "arredondado" :9, "truncado" :8 }{ " data" :8,45, "arredondado" :8, "truncado" :8 }{ "dados" :8,451, "arredondado" :8, "truncado" :8 }{ "dados" :-8,99, "arredondado" :-9 , "truncado" :-8 }{ "dados" :-8.45, "arredondado" :-8, "truncado" :-8 }{ "dados" :-8.451, "arredondado" :-8, "truncado" :- 8 }
Podemos ver que em alguns casos, o resultado é o mesmo. Em outros, é diferente. Por exemplo, quando o valor de entrada é
0.9
, o $round
operador arredonda o número para 1
. O $truncate
por outro lado, simplesmente remove o .9
parte, que produz um resultado de 0
. Locais fracionários negativos
Ambos os operadores aceitam um segundo argumento opcional. Quando presente, este argumento especifica o número de casas decimais para arredondar/truncar o número.
Fornecer este segundo argumento pode destacar ainda mais a diferença entre os dois operadores.
Exemplo:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] },
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Resultado:
{ "dados" :0, "arredondado" :0, "truncado" :0 }{ "dados" :8, "arredondado" :8, "truncado" :8 }{ "dados" :0.5, "arredondado " :0,5, "truncado" :0,5 }{ "dados" :0,9, "arredondado" :0,9, "truncado" :0,9 }{ "dados" :8,99, "arredondado" :9, "truncado" :8,9 }{ " data" :8,45, "arredondado" :8,4, "truncado" :8,4 }{ "dados" :8,451, "arredondado" :8,5, "truncado" :8,4 }{ "dados" :-8,99, "arredondado" :-9 , "truncado" :-8.9 }{ "dados" :-8.45, "arredondado" :-8.4, "truncado" :-8.4 }{ "dados" :-8.451, "arredondado" :-8.5, "truncado" :- 8.4 }
Novamente podemos ver que alguns resultados são idênticos enquanto outros não são.
Locais fracionários negativos
Ambos os operadores aceitam um valor negativo para o segundo argumento.
Exemplo:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", -1 ] },
truncated: { $trunc: [ "$data", -1 ] }
}
}
]
)
Resultado:
{ "dados" :0, "arredondado" :0, "truncado" :0 }{ "dados" :8, "arredondado" :10, "truncado" :0 }{ "dados" :0.5, "arredondado " :0, "truncado" :0 }{ "dados" :0,9, "arredondado" :0, "truncado" :0 }{ "dados" :8,99, "arredondado" :10, "truncado" :0 }{ " data" :8.45, "rounded" :10, "truncated" :0 }{ "data" :8.451, "rounded" :10, "truncated" :0 }{ "data" :-8.99, "rounded" :-10 , "truncado" :0 }{ "dados" :-8.45, "arredondado" :-10, "truncado" :0 }{ "dados" :-8.451, "arredondado" :-10, "truncado" :0 }
Desta vez, há um forte contraste entre os resultados produzidos pelos dois operadores. O$trunc
operador produziu0
para cada documento, enquanto o$round
operador retornou vários valores, a maioria dos quais foram arredondados para cima ou para baixo.
$floor e $ceil
Mais dois operadores a serem observados ao realizar operações como esta são$floor
e$ceil
. Esses operadores funcionam de maneira semelhante, mas um pouco diferente.
$floor
retorna o maior inteiro menor ou igual ao número especificado$ceil
retorna o menor inteiro maior ou igual ao número especificado.