MongoDB 4.4如何为匹配文档新增amountRefundRemaining字段存储两字段差值
正确实现代码
如果你需要更新所有符合条件的文档,使用updateMany方法,实现如下:
db.paymentTransaction.updateMany( // 第一个参数:所有过滤条件合并到同一个查询对象 { status: "PARTIALLY_REFUNDED", amount: { $exists: true } }, // 第二个参数:使用聚合管道实现同文档字段运算,MongoDB 4.2及以上版本支持 [ { $set: { amountRefundRemaining: { $subtract: [ "$Field_B", "$Field_A" ] } } } ] )
如果仅需要更新第一个匹配到的文档,把方法名替换为updateOne即可。
原有写法的问题修正点
- 过滤条件结构错误:两个过滤规则需要全部放到第一个参数的查询对象内,不能拆分到多个参数,字段存在判断的正确语法是
{ $exists: true }。 - 同文档字段计算需要用聚合管道:MongoDB 4.2及以上版本支持聚合管道格式的更新操作,引用文档自身字段需要加
$前缀,减法运算要使用内置的$subtract操作符,不能直接写算术表达式。
可选的空值兼容优化
如果Field_A或Field_B可能不存在,你可以增加$ifNull操作符设置默认值,避免计算结果为null:
amountRefundRemaining: { $subtract: [ { $ifNull: [ "$Field_B", 0 ] }, { $ifNull: [ "$Field_A", 0 ] } ] }
内容的提问来源于stack exchange,提问作者Patrick Teixeira
相关产品推荐
相关产品推荐

