如何在 nestjs mongoose 打字稿中引用嵌套文档

问题描述

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

dietDays 对象必须包含一个日期字段和包含 2 个对 Meal 架构的引用的膳食对象。

正确的做法是什么?

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

@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' }
      }
    },]
}

解决方法

你应该这样做:

创建一个类来引用饮食中的每一天(逻辑上有意义)

@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' }
  ]
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...