Mongoose无法保存带鉴别器属性的对象问题求助
问题分析与修正
你的代码存在三个核心问题,导致categoryFacts字段无法被正确保存到数据库:
1. 判别器Schema定义错误
你创建的CategorySchema将categoryFacts作为顶层嵌套对象,但判别器的Schema应该直接定义新增字段的结构,无需额外嵌套。同时,判别器Schema不需要重复设置discriminatorKey,该配置仅需在主Schema(ProductSchema)中声明即可。
2. 判别器模型创建方式错误
不能通过mongoose.model()直接创建判别器模型,正确做法是从主模型(ProductModel)的判别器方法中获取,这样Mongoose才能正确识别继承关系。
3. TypeScript接口与Schema字段不匹配
你的Product接口定义了id、productId,但ProductSchema对应的是_id、productCode,字段名不一致会导致类型校验和数据映射失效,间接影响字段保存。
修正后的完整代码
import mongoose, { Document, Schema } from 'mongoose' // 主Schema配置:仅在主Schema中设置判别器标识 const productOptions = { discriminatorKey: 'kind' }; // 修正接口字段,与Schema完全对齐 export interface Product { _id: string, productCode: string, productName: string, productType: string } export interface CategorizedProduct extends Product { categoryFacts: { description: string, categoryClass: string } } // 定义判别器新增字段的Schema:直接声明categoryFacts结构 const CategorizedProductDiscriminatorSchema = new Schema({ categoryFacts: { description: String, categoryClass: String, required: true // 可选:若字段必填可添加该配置 } }) // 主Product Schema export const ProductSchema = new Schema<Product & Document>( { _id: String, productCode: String, productName: String, productType: String }, productOptions ) // 创建主模型 export const ProductModel = mongoose.model<Product & Document>('products', ProductSchema) // 从主模型创建判别器并获取模型 export const CategorizedProductModel = ProductModel.discriminator<CategorizedProduct & Document>( 'CategorizedProduct', CategorizedProductDiscriminatorSchema ) // 索引定义:主Schema的索引会被判别器继承,无需重复定义 ProductSchema.index({ productCode: 1, productName: 1, productType: 1 }, { unique: true }) // 注意:原代码中的clientHoldId字段未在Schema中定义,需先添加到ProductSchema再创建索引 // ProductSchema.index({ clientHoldId: 1 }, { unique: true }) async function saveCategorizedProduct(product: CategorizedProduct) { const result = await CategorizedProductModel.create(product) console.log(result) // 现在会正确包含categoryFacts字段 }
关键修正说明
- 判别器Schema优化:仅定义新增的
categoryFacts字段,复用主Schema的discriminatorKey配置。 - 模型创建规范:通过
ProductModel.discriminator()生成判别器模型,确保Mongoose识别继承关系。 - 字段一致性:TypeScript接口与Schema字段完全匹配,避免类型映射错误。
- 索引复用:主Schema的索引会自动被判别器继承,无需重复定义相同索引。
现在调用saveCategorizedProduct时,传入包含categoryFacts的对象,数据库会正确保存该字段,同时自动添加kind: "CategorizedProduct"标识(由discriminatorKey指定),用于区分不同判别器类型的文档。
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

