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

Mongoose中更新对象数组值时ObjectId与字符串匹配失败如何解决

问题根源与修复方案

1. 先修正模型定义的两处错误

你当前的模型定义存在两处错误,是更新失败的核心原因之一:

  • 拼写错误:Schema.Types.OjectId 遗漏字母b,正确拼写为Schema.Types.ObjectId
  • 类型定义错误:eventId的类型外层套了数组括号,相当于声明该字段是ObjectId数组,如果你业务中每个tareas项对应单个eventId,需要去掉数组括号
    修正后的模型代码:
tareas: [{
  eventId: {
    type: Schema.Types.ObjectId,
    ref: 'Event'
  },
  tareasDelUsuario: {
    type: Array
  }
}],

备注:如果你的业务确实需要每个tareas项对应多个eventId,保留eventId的数组类型即可,只需要把后续查询条件中的eventId匹配逻辑改为'tareas.eventId': { $in: [mongoose.Types.ObjectId(eventId)] }即可正常匹配。

2. 修正查询时的类型不匹配问题

你传入的eventId是字符串格式,需要先转换为Mongoose的ObjectId类型,才能和数据库中存储的ObjectId类型字段匹配。
转换方法:const mongooseEventId = mongoose.Types.ObjectId(eventId)

3. 修正更新操作的代码写法

第一种(位置$运算符写法)

await User.findOneAndUpdate(
  {
    _id: mongoose.Types.ObjectId(id),
    'tareas.eventId': mongoose.Types.ObjectId(eventId)
  },
  {
    $push: {
      'tareas.$.tareasDelUsuario': tarea
    }
  }
);

第二种(arrayFilters写法)

注意你之前用了$set会直接覆盖整个tareasDelUsuario数组,如果是追加元素要换成$push,如果是全量替换再保留$set:

// 追加元素版本
await User.findOneAndUpdate(
  { _id: mongoose.Types.ObjectId(id) },
  {
    $push: { 'tareas.$[el].tareasDelUsuario': tarea }
  },
  {
    arrayFilters: [{ 'el.eventId': mongoose.Types.ObjectId(eventId) }]
  }
);

内容的提问来源于stack exchange,提问作者Estani Pettigrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:09:01