如何使用 @nestjs/mongoose 中的 @Prop 装饰器添加嵌套对象数组

Art*_*nko 2 javascript mongoose typescript-decorator nestjs nestjs-mongoose

当我在 prop 装饰器中使用嵌套的对象数组时:

@Schema()
export class Child {
  @Prop()
  name: string;
}
    
@Schema()
export class Parent {
  @Prop({type: [Child], _id: false}) // don't need `_id` for nested objects
  children: Child[];
}

export const ParentSchema = SchemaFactory.createForClass(Parent);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

TypeError: Invalid schema configuration: `Child` is not a valid type within the array `children`.
Run Code Online (Sandbox Code Playgroud)

如果我需要使用@Prop({_id: false})(以保持嵌套模式独立),我该如何解决这个问题?


如果我们更改 prop 装饰器,@Prop([Child])它就可以工作,但是我们需要禁用_id嵌套对象:

@Schema({_id: false})
export class Child {
  @Prop()
  name: string;
}

@Schema()
export class Parent {
  @Prop([Child])
  children: Child[];
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们不会有通用的 Child 对象,我们不会将它们用作独立的架构。

另一种方法是创建Child架构并在 中使用它@Prop({type: [childSchema], _id: false}),但这看起来像是一种开销。

小智 5

描述您的情况的一个简单示例是:

import { Document, Schema as MongooseSchema } from 'mongoose';
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';

class GuildMember {
  @Prop({ type: String, required: true, lowercase: true })
  _id: string;

  @Prop({ required: true })
  id: number;

  @Prop({ required: true })
  rank: number;
}

@Schema({ timestamps: true })
export class Guild extends Document {
  @Prop({ type: String, required: true, lowercase: true })
  _id: string;

  @Prop({ type: MongooseSchema.Types.Array})
  members: GuildMember[]
}

export const GuildsSchema = SchemaFactory.createForClass(Guild);
Run Code Online (Sandbox Code Playgroud)

因为在嵌套模式中,您没有在 prop 装饰器内部定义类型,而只是告诉该字段是一个数组并使用 TypeScript 验证类型