MongoDB中$inc内用$subtract引用字段报CastError如何解决?
问题原因与解决方案
你当前的写法不可行,核心原因是MongoDB常规更新操作不支持在更新操作符中直接引用文档自身的当前字段值。
- 你代码里在
$inc的参数中传入了包含$subtract的聚合表达式,常规更新模式下MongoDB会把这个表达式对象直接当作要写入total_discount字段的数值,自然会触发类型转换失败的CastError。 - 只有MongoDB 4.2及以上版本支持的聚合管道更新语法,才允许在更新逻辑中引用文档当前字段值做计算。
正确实现代码如下:
updateLastDiscount(orderId, lastDiscount) { return Order.findOneAndUpdate( { "_id": orderId }, // 传入聚合数组启用管道更新逻辑 [ { $set: { last_discount: lastDiscount, total_discount: { $add: [ "$total_discount", { $subtract: [lastDiscount, "$last_discount"] } ] } } } ] ); }
上述代码在同一个$set阶段完成两个字段的更新:
- 直接将
last_discount设置为传入的新值 - 用
$subtract计算新旧last_discount的差值,再通过$add将差值叠加到原total_discount上,等效于你原来想要实现的增减逻辑。
内容的提问来源于stack exchange,提问作者Web Jigooli
相关产品推荐
相关产品推荐

