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

MongoDB $ subtrair


No MongoDB, você pode usar o $subtract operador de pipeline de agregação para subtrair números e/ou datas.

Especificamente, $subtract pode fazer as três coisas a seguir:
  • Subtraia dois números para retornar a diferença
  • Subtraia um número (em milissegundos) de uma data e retorne a data resultante
  • Subtraia duas datas para retornar a diferença em milissegundos

O $subtract operador aceita os valores como argumentos. Os argumentos podem ser qualquer expressão válida, desde que resolvam para números e/ou datas. Para subtrair um número de uma data, a data deve ser o primeiro argumento.

Dados de amostra


Suponha que tenhamos uma coleção chamada data com o seguinte documento:
{ "_id" :1, "a" :20000, "b" :250, "start" :ISODate("2021-01-03T00:00:00Z"), "end" :ISODate("2021- 01-03T23:30:15.100Z")}

Subtrair números


Podemos usar o $subtract operador para subtrair o a campo do b campo (ou vice-versa).

Exemplo:
db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       a: 1, 
       b: 1, 
       result: { 
         $subtract: [ "$a", "$b" ] } } 
         }
   ]
) 

Resultado:
{ "a" :20000, "b" :250, "resultado" :19750 }

Subtrair um número de uma data


Se o primeiro argumento for uma data e o segundo argumento for um número, o $subtract operador subtrai o número da data em milissegundos.

Exemplo:
db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       b: 1, 
       start: 1, 
       result: { 
         $subtract: [ "$start", "$b" ] } } 
         }
   ]
).pretty() 

Resultado:
{ "b" :250, "start" :ISODate("2021-01-03T00:00:00Z"), "resultado" :ISODate("2021-01-02T23:59:59.750Z")} 
Podemos ver que 250 milissegundos foram subtraídos da data.

Quando subtraímos um número de uma data, a data deve ser o primeiro argumento com o número como segundo argumento.

Aqui está o que acontece se mudarmos os argumentos:
db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       b: 1, 
       start: 1, 
       result: { 
         $subtract: [ "$b", "$start" ] } } 
         }
   ]
).pretty() 

Resultado:
exceção não capturada:Erro:o comando falhou:{ "ok":0, "errmsg":"cant $subtract adate from a double", "code":16556, "codeName":"Location16556"}:agregado falhou:[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:618:17example@ sqldat.com/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1046:12@(shell ):1:1

Recebemos um erro informando que não é possível subtrair uma data de um duplo.

Retorne a diferença entre duas datas


Se ambos os argumentos forem datas, então o $subtract O operador retorna a diferença entre as duas datas em milissegundos.

Exemplo:
db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       start: 1, 
       end: 1,
       result: { 
         $subtract: [ "$end", "$start" ] } } 
         }
   ]
).pretty() 

Resultado:
{ "início":ISODate("2021-01-03T00:00:00Z"), "fim":ISODate("2021-01-03T23:30:15.100Z"), "resultado":NumberLong(84615100 )}

Se mudarmos as datas, o resultado se torna um valor negativo:
db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       start: 1, 
       end: 1,
       result: { 
         $subtract: [ "$start", "$end" ] } } 
         }
   ]
).pretty() 

Resultado:
{ "start":ISODate("2021-01-03T00:00:00Z"), "end":ISODate("2021-01-03T23:30:15.100Z"), "result":NumberLong(- 84615100)}

Passando o número errado de argumentos


O $subtract operador aceita exatamente dois argumentos. Passar o número errado de argumentos resulta em erro.

Exemplo:
db.data.aggregate(
   [
     { $project: { 
       result: { 
         $subtract: [ "$a" ] } } 
         }
   ]
) 

Resultado:
exceção não capturada:Erro:o comando falhou:{ "ok" :0, "errmsg" :"Invalid $project ::causado por ::Expressão $subtract recebe exatamente 2 argumentos. 1 foi passado.", "code" :16020, "codeName" :"Location16020"} :falha na agregação :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:14example@sqldat .com/mongo/shell/assert.js:618:[email protected]/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected] /mongo/shell/collection.js:1046:12@(shell):1:1

Passando valores nulos


Passando dois null valores resulta em null sendo devolvido.

Exemplo:
db.data.aggregate(
   [
     { $project: { 
       result: { 
         $subtract: [ null, null ] } } 
         }
   ]
) 

Resultado:
{ "_id":1, "resultado":null }