假设我想用mongoose构建下面的模式:
const userSchema = new Schema({
name: {
firstName: String,
lastName: String
}
})
如何使用NestJS装饰器(@Schema()
& @Prop()
)来实现这一点?
我试过这个方法,但没有运气:
@Schema()
class Name {
@Prop()
firstName: string;
@Prop()
lastName: string;
}
@Schema()
class User extends Document {
@Prop({ type: Name })
name: Name;
}
我也不想使用raw()
方法。
7条答案
按热度按时间q9rjltbz1#
下面是我的方法,它工作得很好,而且不涉及删除@schema():
当您在方案中设置了该选项时,这将正确保存并显示时间戳
0qx6xfy62#
所做变更:
1.子文档类没有
@Schema
装饰器1.子单据类需要从
'mongoose'
扩展Document
user.schema.ts
name.schema.ts
oyjwcjzk3#
我还没有发现NestJS的这一部分足够灵活。对我来说,一个可行的解决方案(已测试)如下:
以这种方式定义模式将保留所有内容(类装饰器、传递的选项、数据类型验证、NestJS功能等)按预期工作。唯一的"问题"是将为每个
@Schema
创建_id
属性,而您可能不希望这样,您可以通过将{_id: false}
作为选项对象添加到@Schema()
中来避免这种情况。请记住,任何进一步的嵌套模式都不会被阻止创建_id
属性,例如这一点:
会产生这样的结果
另一种解决方法是使用原生mongoose在NestJS中创建模式,如下所示:
ego6inou4#
你也可以用这个。
k0pti3hp5#
尝试从嵌套的“Name”中删除@schema()装饰器,只将其留在文档的根位置。
还要记住在根级别扩展“mongoose.Document”。
qaxu7uf26#
顶级文档
我使用
default: () => ({})
创建默认值。嵌入文档
为了确保能够识别
@Prop()
,并防止自动创建集合,我传递了{ _id: false }
。6ss1mwsb7#
首先,你应该使用mongoose模式来处理这个问题,它很简单明了:
如果你不喜欢这种方法,你应该按照官方文档: