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:1Passando valores nulos
Passando doisnull
valores resulta emnull
sendo devolvido.
Exemplo:
db.data.aggregate( [ { $project: { result: { $subtract: [ null, null ] } } } ] )
Resultado:
{ "_id":1, "resultado":null }