MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $round vs $trunc:Qual é a diferença?


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 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.
  • $floor retorna o maior inteiro menor ou igual ao número especificado
  • $ceil retorna o menor inteiro maior ou igual ao número especificado.