Node.js使用mongoose-extend-schema继承schema时扩展字段丢失如何解决
问题原因
- 核心错误是你仅基于
userSchema创建了基础User模型,扩展得到clientSchema后没有基于该扩展Schema生成对应的Client模型,实例化时仍然用了仅包含基础字段的User模型,Mongoose默认会自动过滤所有未在模型绑定Schema中定义的字段,因此你传入的Client扩展字段全部被丢弃。 - 你使用的
mongoose-extend-schema仅实现了Schema层面的属性合并,不会自动生成对应的模型,也不会修改原有基础User模型的字段定义。
解决方案
方法1:继续使用mongoose-extend-schema
- 在模型定义代码末尾,基于扩展后的
clientSchema创建Client模型并导出:
const Client = mongoose.model("Client", clientSchema); exports.Client = Client;
- 修改实例化代码,将
new User替换为new Client即可:
client = new Client({ // 原有传参字段保持不变 })
方法2(更稳定,推荐):使用Mongoose原生单表继承(Discriminator)
Mongoose内置了鉴别器功能实现同集合的模型继承,无需依赖第三方包,兼容性和稳定性更好:
- 删掉
extendSchema相关代码,直接通过User.discriminator定义Client模型:
// 原有userSchema和User模型定义保持不变 const Client = User.discriminator('Client', new mongoose.Schema({ rep:{ type: String, default:"EA000" }, Src_Client: { type: String, enum: ["prospect","externe"], default:"externe" }, // 其他你要扩展的Client字段保持不变 })) exports.Client = Client;
- 实例化时同样使用
new Client即可,两种模型的数据会自动存入同一个users集合,Mongoose会通过内置的__t字段自动区分模型类型。
内容的提问来源于stack exchange,提问作者Boubaker Takwa
相关产品推荐
相关产品推荐

