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
A partir de MongoDB 5.0, el resultado tendrá el mismo tipo que la entrada, excepto cuando no pueda representarse con precisión en ese tipo. En estos casos:
Un entero de 32bits se convertirá en un entero de 64bits si el resultado se puede representar como un entero de 64bits.
Un entero de 32bits se convertirá en un doble si el resultado no se puede representar como un entero de 64bits.
Un entero de 64bits se convertirá en doble si el resultado no se puede representar como un entero de 64bits.
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") }