我发现NestJS的这部分不够灵活。对我而言,一个经过测试的工作解决方案如下:
@Schema({_id: false})
class Name {
@Prop()
firstName: string;
@Prop()
lastName: string;
}
@Schema()
class User {
@Prop({type: Name})
name: Name;
}
以这种方式定义模式将使所有内容(类装饰器、传递的选项、数据类型验证、NestJS 功能等)按预期工作。唯一的“问题”是每个@Schema都将创建一个 _id 属性,您可能不希望这样做,就像在您的情况下一样。您可以通过将 { _id: false } 添加为选项对象到您的 @Schema() 来避免这种情况。请记住,任何进一步嵌套的模式都无法防止创建 _id 属性,例如:
这个:
@Schema()
class Father {
age: number;
name: string;
}
@Schema({_id: false})
class Parents {
@Prop()
father: Father;
@Prop()
mother: string;
}
@Schema()
class Person {
@Prop()
parents: Parents;
}
会生成这个:
{
_id: ObjectId('someIdThatMongoGenerated'),
parents: {
father: {
_id: ObjectId('someIdThatMongoGenerated'),
age: 40,
name: Jon Doe
},
mother: Jane Doe
}
}
另一个解决方法是在NestJS中使用本地的mongoose来创建模式,如下所示:
const UserSchema = new mongoose.Schema({
name: {
firstName: {
type: String,
required: true
},
lastName: {
type: String,
required: true
}
}
});
raw()
? - Leonardo Marzo