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:example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert.js:618:17example@ sqldat.com/mongo/shell/assert.js:708:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/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 :example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat .com/mongo/shell/assert.js:618:17example@sqldat.com/mongo/shell/assert.js:708:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com /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 }