Definición
$addSuma números o suma números y una fecha. Si uno de los argumentos es una fecha,
$addtrata los demás argumentos como milisegundos para agregar a la fecha.La expresión
$addtiene la siguiente sintaxis:{ $add: [ <expression1>, <expression2>, ... ] } Los argumentos pueden ser cualquier válido. Expresión, siempre que se resuelvan en todos los números o en números y una fecha. Para más información sobre expresiones, consulte Expresiones.
A partir de MongoDB 6.1, puede optimizar la operación
$add. Para mejorar el rendimiento, agrupe las referencias al final de la lista de argumentos. Por ejemplo,$add: [ 1, 2, 3, '$a', '$b', '$c' ]
Comportamiento
Cuando se mezclan los tipos de entrada, $add 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, $add 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 combinar operandos de fecha y no enteros, el $add operador evalúa la matriz de expresiones de izquierda a derecha y redondea los valores numéricos antes de sumarlos al Date valor. Para más información, consulte Agregar valores no enteros a una fecha.
Ejemplos
Los siguientes ejemplos utilizan una colección sales con los siguientes documentos:
db.sales.insertMany( [ { _id : 1, "item" : "abc", "price" : 10, "fee" : 2, date: ISODate("2014-03-01T08:00:00Z") }, { _id : 2, "item" : "jkl", "price" : 20, "fee" : 1, date: ISODate("2014-03-01T09:00:00Z") }, { _id : 3, "item" : "xyz", "price" : 5, "fee" : 0, date: ISODate("2014-03-15T09:00:00Z") } ] )
Agregar números
La siguiente agregación utiliza la expresión $add $project en la canalización para calcular el costo total:
db.sales.aggregate( [ { $project: { item: 1, total: { $add: [ "$price", "$fee" ] } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : 1, "item" : "abc", "total" : 12 } { "_id" : 2, "item" : "jkl", "total" : 21 } { "_id" : 3, "item" : "xyz", "total" : 5 }
Realizar sumas en una fecha
La siguiente agregación utiliza la expresión para $add calcular billing_date agregando 3*24*60*60000 milisegundos (es decir, 3 días) al date campo:
db.sales.aggregate( [ { $project: { item: 1, billing_date: { $add: [ "$date", 3*24*60*60000 ] } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : 1, "item" : "abc", "billing_date" : ISODate("2014-03-04T08:00:00Z") } { "_id" : 2, "item" : "jkl", "billing_date" : ISODate("2014-03-04T09:00:00Z") } { "_id" : 3, "item" : "xyz", "billing_date" : ISODate("2014-03-18T09:00:00Z") }
Agregar valores no enteros a una fecha
La siguiente agregación utiliza la expresión $add para calcular el campo result agregando valores numéricos al campo date:
db.sales.aggregate( [ { $project: { item: 1, result: { $add: [ 1.5, 1.6, "$date", 1.5, 1.5 ] } } } ] )
{ "_id" : 1, "item" : 'abc', "result" : ISODate("2014-03-01T08:00:00.007Z") } { "_id" : 2, "item" : 'jkl', "result" : ISODate("2014-03-01T09:00:00.007Z") } { "_id" : 3, "item" : 'xyz', "result" : ISODate("2014-03-15T09:00:00.007Z") }
Tenga en cuenta que, aunque la suma de expresiones que no son de fecha es 6.1 milisegundos, la agregación da como resultado el campo inicial $date más 7 milisegundos debido a la asociatividad izquierda de la operación $add.
Cuando $add evalúa la matriz de expresiones de izquierda a derecha, primero suma los dos valores numéricos 1.5 y 1.6. El 3.1 resultante se redondea a 3 antes de sumarse al campo $date. A continuación, se suma al valor redondeado de 1.5 (que es 2) y, finalmente, al valor redondeado del 1.5 final (que también es 2).