【发布时间】:2022-03-15 18:15:36
【问题描述】:
在 NestJs 中,我试图让 mongoose 基于其属性之一可以具有不同类型的模式创建文档。但是,当我保存文档时,与特定类型相关的所有属性都会丢失。我错过了什么?为了简单起见,在这个 sn-p 中我使用了一个字符串数组而不是输入枚举
@Schema()
export class ClassAModel {
@Prop({ type: ClassBSchema, required: true })
object!: ClassB1Model | ClassB2Model
}
export const ClassASchema = SchemaFactory.createForClass(ClassAModel)
///
@Schema({ _id: false })
export class ClassB1Model {
@Prop({ enum: ['B1'], required: true })
type!: 'B1'
@Prop({ required: true })
onlyForClassB1Model!: string
}
export const ClassB1Schema = SchemaFactory.createForClass(ClassB1Model)
///
@Schema({ _id: false })
export class ClassB2Model {
@Prop({ enum: ['B2'], required: true })
type!: 'B2'
@Prop({ required: true })
onlyForClassB2Model!: string
}
export const ClassB2Schema = SchemaFactory.createForClass(ClassB2Model)
///
@Schema({ _id: false, discriminatorKey: 'type' })
export class ClassBModel {
@Prop({ enum: ['B1', 'B2'], required: true })
type!: 'B1' | 'B2'
}
export const ClassBSchema = SchemaFactory.createForClass(ClassBModel)
ClassBSchema.discriminators = {
B1: ClassB1Schema,
B2: ClassB2Schema,
}
当我尝试使用模型实例保存文档时,它只保存了 ClassBModel 中定义的道具(所以只有类型)。所有其他道具都没有被拾取。
// some class method
public async saveDoc(): Promise<void> {
const payload = {
object: {
type: 'B2',
onlyForClassB2Model: 'random string'
}
}
return this.model.create(payload) // yields { object: { type: 'B2' } }
}
我知道顶级文档的鉴别器可以按照 NestJSDocs 中的描述定义,使用 nestjs 模块中的鉴别器,但这是一个不同的情况,鉴别器位于注入模型的内部。如何让 mongoose 认识到它需要保存有效载荷中的所有属性?
【问题讨论】:
-
一种草率的方式只是在单个模型中定义所有属性,然后将所有子类型属性设为可选,但我绝对更喜欢在猫鼬模式中明确定义不同的子类型
标签: mongoose polymorphism nestjs mongoose-schema