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
$roundoperador rodadas um número para um inteiro inteiro ou para uma casa decimal especificada. - O
$truncateoperador 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 produziu 0 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.
$floorretorna o maior inteiro menor ou igual ao número especificado$ceilretorna o menor inteiro maior ou igual ao número especificado.