定义
行为
从 MongoDB 5.0 开始,使用带空操作数表达式 ({ }) 的更新操作符(如 $mul)时,mongod 不会再引发错误。空更新不会导致任何变化,也不会创建 oplog 条目(意味着该操作为“无操作”)。
从 MongoDB 5.0 开始,更新操作符按字典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。详情请参阅更新操作符行为。
缺失字段
如果文档中不存在该字段,$mul 将创建该字段并将字段值设置为与乘数数值类型相同的零。
原子性
$mul 是单个文档中的原子操作。
混合类型
与混合数值类型(32 位整数、64 位整数、Double、十进制128)的值相乘可能会导致数值类型转换。对于与混合数值类型的值相乘的运算,以下类型转换规则适用:
| 数据类型 | 32 位整数 | 64 位整数 | double | Decimal128 | 
|---|---|---|---|---|
| 32 位整数 | 32 位或 64 位整数 | 64 位整数 | double | Decimal128 | 
| 64 位整数 | 64 位整数 | 64 位整数 | double | Decimal128 | 
| double | double | double | double | Decimal128 | 
| Decimal128 | Decimal128 | Decimal128 | Decimal128 | Decimal128 | 
注意
- 如果两个 32 位整数的乘积超过 32 位整数的最大值,则结果为 64 位整数。 
- 超过 64 位整数最大值的任何类型的整数运算都会产生错误。 
示例
将字段值相乘
创建 products 集合:
db.products.insertOne(    { "_id" : 1, "item" : "Hats", "price" : Decimal128("10.99"), "quantity" : 25 } ) 
在以下操作中,db.collection.updateOne() 会更新文档。$mul 运算符会将 price 字段乘以 1.25,将 quantity 字段乘以 2:
db.products.updateOne(    { _id: 1 },    { $mul:       {          price: Decimal128( "1.25" ),          quantity: 2        }    } ) 
在更新的文档中:
- price是原始值 10.99,乘以 1.25
- quantity是原值 25 乘以 2
{ _id: 1, item: 'Hats', price: Decimal128("13.7375"), quantity: 50 } 
将 $mul 操作符应用于不存在的字段
将以下文档添加到 products 集合中:
db.products.insertOne( { _id: 2,  item: "Unknown" } ) 
在以下操作中,db.collection.updateOne() 尝试将 $mul 操作符应用于文档中没有的字段:
db.products.updateOne(    { _id: 2 },    { $mul: { price: Decimal128("100") } } ) 
- 插入 - price字段
- 设置 Decimal128("0") 
{ "_id" : 2, "item" : "Unknown", "price" : Long(0) } 
price 字段具有与乘数相同的类型,即 Decimal128。
与混合数字类型相乘
将以下文档添加到 products 集合中:
db.products.insertOne( { _id: 3,  item: "Scarf", price: Decimal128("10") } ) 
在以下运算中,db.collection.updateOne() 使用 $mul 操作符将 price 字段 Decimal128(10) 中的值与 Int32(5) 相乘:
db.products.updateOne(    { _id: 3 },    { $mul: { price: Int32(5) } } ) 
该操作生成以下文档:
{ _id: 3, item: 'Scarf', price: Decimal128("50") } 
price 字段值的类型为 Decimal128。有关详细信息,请参阅 乘法类型转换规则 。