使用findOneAndUpdate无法更新数组对象字段,求问题排查
数组对象多字段更新未生效,求排查原因
我尝试更新数组中某个对象的多个字段,但操作未生效,请问我哪里出错了?
数据示例:
{ _id: 'mongodbid', name: 'something', employees: [ { age: 25, name: 'name', salary: 500 }, { age: 28, name: 'name2', salary: 700 } ], }
查询语句:
await this.somethingModel .findOneAndUpdate( { _id: id, 'employees.age': 25, }, { $set: { 'employees.$.salary': 600, 'employees.$.name': 'name4', } }, ) .exec();
可能的问题及解决方法
- 误判更新结果:默认
findOneAndUpdate返回更新前的文档,你可能误以为操作未生效。添加{ new: true }选项,获取更新后的文档确认状态:await this.somethingModel .findOneAndUpdate( { _id: id, 'employees.age': 25 }, { $set: { 'employees.$.salary': 600, 'employees.$.name': 'name4' } }, { new: true } ) .exec(); - _id类型不匹配:如果传入的
id是字符串,而数据库中_id是ObjectId类型,查询会匹配失败。需要将id转换为ObjectId:const { ObjectId } = require('mongoose'); await this.somethingModel .findOneAndUpdate( { _id: ObjectId(id), 'employees.age': 25 }, { $set: { 'employees.$.salary': 600, 'employees.$.name': 'name4' } }, { new: true } ) .exec(); - Schema定义错误:检查
employees字段在Schema中是否正确定义为数组类型,否则Mongoose无法正确处理数组更新:const somethingSchema = new Schema({ name: String, employees: [{ age: Number, name: String, salary: Number }] }); - 多元素匹配问题:如果
employees数组中有多个age:25的对象,$占位符仅会匹配第一个符合条件的元素。若需要更新所有匹配元素,需改用$[]或$[identifier]语法。
内容的提问来源于stack exchange,提问作者Mojtaba
相关产品推荐
相关产品推荐

