You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
  }
);

代码说明

  1. 用聚合管道数组替代传统更新文档,以此支持聚合表达式引用字段值。
  2. $filter用于从meals数组中筛选出name等于extraMealName的元素。
  3. $first获取筛选后数组的第一个元素(你的查询条件已确保至少有一个匹配项)。
  4. $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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:15:50