Mongoose查询Franchise模型的Employee子文档每次返回不同_id如何解决
Mongoose子文档数组_id动态变动解决方案
问题原因
Mongoose默认会为所有子文档Schema自动生成_id字段,该值写入MongoDB后默认固定不变。你遇到的同一条子文档多次查询返回不同_id的问题,通常是更新操作时直接替换了整个managers数组项,没有保留原有子文档的_id,导致Mongoose每次都为新传入的对象生成全新的_id。
可行解决方案
- 方案1:使用子文档数组原生操作方法更新,保留原有
_id
不要直接对managers字段做全数组覆盖赋值,改用Mongoose内置的子文档操作方法修改内容,原有子文档的_id会自动保留:
新增子文档时也直接调用数组const franchise = await Franchise.findById(franchiseId); // 匹配到需要修改的manager子文档 const targetManager = franchise.managers.id(targetManagerId); // 仅更新需要修改的字段,不替换整个子文档对象 targetManager.phoneNo = 13000000000; await franchise.save();push方法即可,自动生成的_id会持久化存储,后续查询不会变动。 - 方案2:自定义固定
_id字段
如果你希望用业务唯一字段作为子文档的固定标识,可以关闭自动生成_id的配置,手动指定_id为业务唯一值:
修改Employee.js的Schema定义:
后续新增manager时手动给const Employee = new mongoose.Schema( { _id: String, // 可指定为你的业务唯一字段类型,比如用员工邮箱作为_id name: String, email: String, phoneNo: Number, password: String, }, { _id: false } // 关闭Mongoose自动生成_id的逻辑 ); export default Employee;_id赋值为唯一业务值(比如员工邮箱、工号),只要业务值不变,_id就不会变动。 - 方案3:不需要子文档
_id可直接关闭
如果你完全不需要用到子文档的_id字段,直接在Schema配置中关闭自动生成即可,从根源避免_id变动问题:const Employee = new mongoose.Schema( { name: String, email: String, phoneNo: Number, password: String, }, { _id: false } // 关闭自动生成_id );
内容的提问来源于stack exchange,提问作者Niketan Gulekar
相关产品推荐
相关产品推荐

