MongoDB/Mongoose updateMany使用$inc时触发CastError错误求助
问题解决:MongoDB $inc引用字段导致CastError
错误原因
你遇到的CastError是因为$inc操作符的参数要求是数值类型,但你传入的是字符串'meals.$.calories',MongoDB无法将这个字符串转换为数字用于增量计算。同时传统更新操作符(如$inc)不支持直接引用文档内的其他字段作为参数值,必须通过聚合管道实现字段间的数值运算。
正确实现方式
从MongoDB 4.2版本开始,updateMany支持使用聚合管道作为更新内容,可通过$add操作符将根级calories与匹配到的数组元素的calories相加。具体代码如下:
await Meals.updateMany( { user: user, 'meals.name': extraMealName }, [ { $set: { calories: { $add: [ '$calories', // 从meals数组筛选出name匹配的元素,取出其calories值 { $first: { $filter: { input: '$meals', cond: { $eq: ['$$this.name', extraMealName] } } } }.calories ] } } } ], { multi: true }, function(error, result) { console.log(error); } );
代码说明
- 用聚合管道数组替代传统更新文档,以此支持聚合表达式引用字段值。
$filter用于从meals数组中筛选出name等于extraMealName的元素。$first获取筛选后数组的第一个元素(你的查询条件已确保至少有一个匹配项)。$add将原根级calories与匹配餐品的calories相加,重新赋值给根级calories。
额外说明
- 确保MongoDB版本≥4.2,只有该版本及以上才支持在更新操作中使用聚合管道。
- 若
meals数组中可能存在多个同名餐品,可改用$sum累加所有匹配项的calories:calories: { $add: [ '$calories', { $sum: { $map: { input: { $filter: { input: '$meals', cond: { $eq: ['$$this.name', extraMealName] } } }, in: '$$this.calories' } } } ] }
内容的提问来源于stack exchange,提问作者Cinc-B
相关产品推荐
相关产品推荐

