Definición
$subtractResta dos números para devolver la diferencia, o dos fechas para devolver la diferencia en milisegundos, o una fecha y un número en milisegundos para devolver la fecha resultante.
El
$subtractLa expresión tiene la siguiente sintaxis:{ $subtract: [ <expression1>, <expression2> ] } El segundo argumento se resta del primer argumento.
Los argumentos pueden ser cualquier válido. Expresión, siempre que se resuelvan en números o fechas. Para restar un número a una fecha, la fecha debe ser el primer argumento. Para más información sobre expresiones, consulte Expresiones.
Comportamiento
Cuando se mezclan los tipos de entrada, $subtract promueve el tipo de entrada menor al mayor de los dos. Un tipo se considera mayor cuando representa un rango más amplio de valores. El orden de los tipos numéricos, de menor a mayor, es: entero → largo → doble → decimal
El tipo de entrada mayor también determina el tipo de resultado, a menos que la operación se desborde y salga del rango representado por ese tipo de dato mayor. En casos de desbordamiento, $subtract promueve el resultado según el siguiente orden:
Si el tipo de entrada más grande es
integer, el tipo de resultado se eleva along.Si el tipo de entrada más grande es
long, el tipo de resultado se eleva adouble.Si el tipo mayor es
doubleodecimal, el resultado del desbordamiento se representa como + o - infinito. No hay promoción de tipo del resultado.
Al mezclar operandos y no Date enteros, $subtract redondea el valor no entero al entero más cercano antes de realizar la operación.
Ejemplos
Considera una colección sales con los siguientes documentos:
db.sales.insertMany([ { "_id" : 1, "item" : "abc", "price" : 10, "fee" : 2, "discount" : 5, "date" : ISODate("2014-03-01T08:00:00Z") }, { "_id" : 2, "item" : "jkl", "price" : 20, "fee" : 1, "discount" : 2, "date" : ISODate("2014-03-01T09:00:00Z") } ])
Restar números
La siguiente agregación utiliza la expresión para $subtract calcular total restando discount del subtotal de price y.fee
db.sales.aggregate( [ { $project: { item: 1, total: { $subtract: [ { $add: [ "$price", "$fee" ] }, "$discount" ] } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : 1, "item" : "abc", "total" : 7 } { "_id" : 2, "item" : "jkl", "total" : 19 }
Restar dos fechas
La siguiente agregación utiliza la expresión para $subtract restar $date de la fecha actual, utilizando el sistema y devuelve la diferencia en NOW milisegundos:
db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [ "$$NOW", "$date" ] } } } ] )
Alternativamente, puede utilizar para la fecha Date() actual:
db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [ new Date(), "$date" ] } } } ] )
Ambas operaciones devuelven documentos que se parecen a los siguientes:
{ "_id" : 1, "item" : "abc", "dateDifference" : Long("186136746187") } { "_id" : 2, "item" : "jkl", "dateDifference" : Long("186133146187") }
Restar milisegundos de una fecha
La siguiente agregación utiliza la expresión para $subtract restar 5 * 60 * 1000 milisegundos (5 minutos) del campo "$date":
db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [ "$date", 5 * 60 * 1000 ] } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : 1, "item" : "abc", "dateDifference" : ISODate("2014-03-01T07:55:00Z") } { "_id" : 2, "item" : "jkl", "dateDifference" : ISODate("2014-03-01T08:55:00Z") }