Definición
$multiplyMultiplica los números y devuelve el resultado. Pasa los argumentos a
$multiplyen un arreglo.La expresión
$multiplytiene la siguiente sintaxis:{ $multiply: [ <expression1>, <expression2>, ... ] } Los argumentos pueden ser cualquier expresión válida siempre y cuando se resuelvan en números. Para obtener más información sobre las expresiones, consultar Expresiones.
A partir de MongoDB 6.1 puedes optimizar la operación
$multiply. Para mejorar el rendimiento, agrupa las referencias al final de la lista de argumentos. Por ejemplo,$multiply: [ 1, 2, 3, '$a', '$b', '$c' ]
Comportamiento
Cuando se mezclan los tipos de entrada, $multiply 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, $multiply promueve el resultado según el siguiente orden:
Ejemplo
Considera una colección sales con los siguientes documentos:
db.sales.insertMany( [ { _id : 1, "item" : "abc", "price" : 10, "quantity": 2, date: ISODate("2014-03-01T08:00:00Z") }, { _id : 2, "item" : "jkl", "price" : 20, "quantity": 1, date: ISODate("2014-03-01T09:00:00Z") }, { _id : 3, "item" : "xyz", "price" : 5, "quantity": 10, date: ISODate("2014-03-15T09:00:00Z") } ] )
La siguiente agregación utiliza la expresión $multiply en la $project pipeline para multiplicar los campos price y quantity:
db.sales.aggregate( [ { $project: { date: 1, item: 1, total: { $multiply: [ "$price", "$quantity" ] } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : 1, "item" : "abc", "date" : ISODate("2014-03-01T08:00:00Z"), "total" : 20 } { "_id" : 2, "item" : "jkl", "date" : ISODate("2014-03-01T09:00:00Z"), "total" : 20 } { "_id" : 3, "item" : "xyz", "date" : ISODate("2014-03-15T09:00:00Z"), "total" : 50 }