如何在nestjs mongoose typescript中引用嵌套文档

Posted

技术标签:

【中文标题】如何在nestjs mongoose typescript中引用嵌套文档【英文标题】:how to reference nested documents in nestjs mongoose typescript 【发布时间】:2021-07-20 15:01:00 【问题描述】:

我是 nestjs 的新手。我使用@nestjs/mongoose,我需要在我的类模式中引用嵌套对象中的几个字段,但我不知道该怎么做。

dietDays 对象必须包含一个日期字段和餐点对象,其中包含对 Meal 架构的 2 个引用。

正确的做法是什么?

下面的代码显示了我是如何尝试这样做的,以及我尝试的另一种方法是创建 dietDays 类并将其传递给 Prop 类型变量,但在那种情况下我无法引用 @987654325 @schema,因为那不是架构。

@Schema()
export class Diet 
  @Prop( default: ObjectID )
  _id: ObjectID 

  @Prop()
  dietDays: [
    
      date: string
      meals: 
        breakfast:  type: Types.ObjectId; ref: 'Meal' 
        lunch:  type: Types.ObjectId; ref: 'Meal' 
      
    ,
  ]


【问题讨论】:

【参考方案1】:

你应该这样做:

创建一个类,它指的是饮食中的每一天(逻辑上有意义)

@Schema()
export class DayInDiet 
  @Prop() date: string;
  @Prop()
  meals:
    
        breakfast:  type: Types.ObjectId, ref: 'breakfast' 
        launch:  type: Types.ObjectId, ref: 'launch' 
    

知道breakfastlunch 中的每一个都应该是有效的mongo 模式。

如果 breakfastlunch 不是架构,并且您有一个内容列表,则可以将此数组作为可能的选项传递给架构对象。

另一种可能的方式

@Schema()
export class DayInDiet 
  @Prop() date: string;
  @Prop()
  meals: [
      type: Types.ObjectId, ref: 'meal'  // note that meal should be the name of your schema
  ]

@Schema()
export class Meal 
  @Prop() name: string;
  @Prop() type: 'launch' | 'breakfast'

简单说明,您不需要将 _id 作为任何架构的道具

编辑

对于饮食模式

@Schema()
export class Diet 
  // list of props
 // ...
  @Prop()
  dietDays: [
     type: Types.ObjectId, ref: 'DayInDiet' 
  ]

【讨论】:

感谢您的回答,但我对应该包含饮食日数组的饮食模式有点困惑(根据您的回答 DayInDiet)。如何在我的饮食模式中使用 DayInDiet 模式?再次感谢:)) @soheib 我已经根据最终的Diet schema 编辑了答案

以上是关于如何在nestjs mongoose typescript中引用嵌套文档的主要内容,如果未能解决你的问题,请参考以下文章

在 @nestjs/mongoose 中设置 mongoose 全局选项

使用@nestjs/mongoose 时如何在文档界面中定义静态猫鼬方法?

如何引用我试图保存在 nestjs/mongoose 中的模式?

如何在@nestjs/mongoose 模式中设置枚举

如何在nestjs mongoose typescript中引用嵌套文档

NestJS + Mongoose:如何测试 document(data).save()?