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

Mongoose向嵌套数组添加数据时报错:Cannot create field 'id' in element {buffHave: []}

Mongoose向嵌套数组添加数据时报错:Cannot create field 'id' in element {buffHave: []}

嘿,我来帮你搞定这个报错问题!

首先得搞清楚报错的根源:你的Schema里buffHave是一个对象数组,每个元素都包含id(数组类型)和duration(日期类型)两个字段。但你现在的updateOne写法是直接对buffHave.id和buffHave.duration执行$push,这相当于试图给buffHave数组里的每一个元素添加这两个字段——可问题是,当buffHave是空数组的时候,根本没有元素可以用来创建这些字段,所以MongoDB就抛出了这个错误。

接下来根据你的实际需求,给你两种解决方案:

情况1:往buffHave数组里新增一个完整的buff对象

如果你的需求是添加一条包含id数组和duration的完整记录到buffHave里,那应该直接把整个对象push到buffHave数组中,代码修改如下:

await userData.updateOne(
  { userId: user.id },
  {
    $push: {
      buffHave: {
        id: [buffId], // 注意id是数组类型,所以要传数组格式的值
        duration: buffs[buffId].duration
      }
    }
  }
);

情况2:给buffHave数组中已存在的对象的id数组添加新元素

如果你的需求是给buffHave里某个已有的对象的id数组追加新的buffId,那需要用**数组过滤器(arrayFilters)**来定位到目标对象,再更新其内部的id字段,示例代码如下:

await userData.updateOne(
  { userId: user.id },
  {
    $push: {
      "buffHave.$[elem].id": buffId
    }
  },
  {
    // 这里的过滤器用来匹配你要更新的那个buffHave元素,可根据实际条件调整,比如按duration筛选
    arrayFilters: [{ "elem.duration": { $exists: true } }]
  }
);

简单总结一下:操作嵌套数组的时候,要区分是往外层数组加对象,还是修改内层对象的字段——前者直接push整个对象到外层数组,后者需要用数组过滤器定位到目标元素再操作。

备注:内容来源于stack exchange,提问作者MZAJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:53:15