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
相关产品推荐
相关产品推荐

