Definición
$mulMultiplica el valor de un campo por un número. Para especificar un
$mulexpresión, utilice el siguiente prototipo:{ $mul: { <field1>: <number1>, ... } } El campo a actualizar debe contener un valor numérico.
Para especificar un
<field>en un documento incrustado o en una matriz, utilice notación de puntos.
Comportamiento
A partir de MongoDB 5.0, mongod ya no genera un error cuando utiliza un operador de actualización como $mul con una expresión de operando vacía ( { } ). Una actualización vacía no produce cambios y no genera ninguna entrada en el oplog (lo que significa que la operación es una “no-op").
A partir de MongoDB 5.0, los operadores de actualización procesan los campos de documentos con nombres basados en cadenas en orden lexicográfico. Los campos con nombres numéricos se procesan en orden numérico. Consulta Comportamiento del operador de actualización para obtener más información.
Campo ausente
Si el campo no existe en un documento, $mul crea el campo y establece el valor en cero de mismo tipo numérico que el multiplicador.
Atómico
$mul es una operación atómica dentro de un único documento.
Tipo mixto
La multiplicación con valores de tipos numéricos mixtos (entero de 32bits, entero de 64bits, doble, decimal128) puede resultar en la conversión del tipo numérico. Para la multiplicación con valores de tipos numéricos mixtos, se aplican las siguientes reglas de conversión de tipos:
Tipo de dato | Entero de 32bits | Entero de 64bits | Double | Decimal128 |
|---|---|---|---|---|
Entero de 32bits | Entero de 32bits o 64bits | Entero de 64bits | Double | Decimal128 |
Entero de 64bits | Entero de 64bits | Entero de 64bits | Double | Decimal128 |
Double | Double | Double | Double | Decimal128 |
Decimal128 | Decimal128 | Decimal128 | Decimal128 | Decimal128 |
Nota
Si el producto de dos enteros de 32 bits supera el valor máximo para un entero de 32 bits, el resultado será un entero de 64 bits.
Las operaciones con enteros de cualquier tipo que superen el valor máximo para un entero de 64 bits generan un error.
Ejemplos
Multiplicar el valor de un campo
Crear la colección products:
db.products.insertOne( { "_id" : 1, "item" : "Hats", "price" : Decimal128("10.99"), "quantity" : 25 } )
En la siguiente operación, db.collection.updateOne()actualiza el documento. El operador$mulmultiplica el campo price por 1.25 y el campo quantity por 2:
db.products.updateOne( { _id: 1 }, { $mul: { price: Decimal128( "1.25" ), quantity: 2 } } )
En el documento actualizado:
pricees el valor original, 10.99, multiplicado por 1.25quantityes el valor original, 25, multiplicado por 2
{ _id: 1, item: 'Hats', price: Decimal128("13.7375"), quantity: 50 }
Aplicar $mul el operador a un campo inexistente
Añada el siguiente documento a la colección products:
db.products.insertOne( { _id: 2, item: "Unknown" } )
En la siguiente operación, intentadb.collection.updateOne() $mul aplicar el operador a un campo que no está en el documento:
db.products.updateOne( { _id: 2 }, { $mul: { price: Decimal128("100") } } )
La db.collection.updateOne() operación
inserta el campo
priceestablece decimal128("0")
{ "_id" : 2, "item" : "Unknown", "price" : Long(0) }
El campo price tiene el mismo tipo, Decimal128, que el multiplicador.
Multiplicar tipos numéricos mixtos
Añada el siguiente documento a la colección products:
db.products.insertOne( { _id: 3, item: "Scarf", price: Decimal128("10") } )
En la siguiente operación, db.collection.updateOne() utiliza el operador para multiplicar el valor en $mul el price campo Decimal()12810 por Int():325
db.products.updateOne( { _id: 3 }, { $mul: { price: Int32(5) } } )
La operación produce el siguiente documento:
{ _id: 3, item: 'Scarf', price: Decimal128("50") }
El valor del price campo es de tipo decimal.128 Consulte las reglas de conversión de tipos de multiplicación para obtener más información.