这是带有装饰器的嵌套模式的完整示例,full example on github
user.entity.ts
import { ObjectType, Field, Int, ID } from '@nestjs/graphql';
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { School } from 'src/school/entities/school.entity';
import * as mongoose from 'mongoose';
export type UserDocument = User & Document;
@ObjectType()
@Schema()
export class User {
@Field((type) => ID,{ nullable: true })
_id: mongoose.Types.ObjectId;
@Field({ nullable: true })
@Prop()
firstname: string;
@Prop({ type: mongoose.Schema.Types.ObjectId, ref: 'School' })
@Field(()=>School,{ nullable: true })
school: School;
}
export const UserSchema = SchemaFactory.createForClass(User);
school.entity.ts
import { ObjectType, Field, Int, ID } from '@nestjs/graphql';
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
import { User } from 'src/user/entities/user.entity';
import * as mongoose from 'mongoose';
export type SchoolDocument = School & Document;
@ObjectType()
@Schema()
export class School {
@Field(() => ID,{ nullable: true })
_id: string;
@Prop()
@Field(() => String,{ nullable: true })
name: string;
@Field(()=>[User],{nullable:true})
@Prop({ type: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }] })
users:User[];
}
export const SchoolSchema= SchemaFactory.createForClass(School);
您应该在解析器中添加@ResolveField,这样您就不会得到子文档的空值。
school.resolver.ts
import { Resolver, Query, Mutation, Args, Int, ResolveField, Parent } from '@nestjs/graphql';
import { SchoolService } from './school.service';
import { School } from './entities/school.entity';
import { CreateSchoolInput } from './dto/create-school.input';
import { UpdateSchoolInput } from './dto/update-school.input';
import { UserService } from 'src/user/user.service';
@Resolver(() => School)
export class SchoolResolver {
constructor(private readonly schoolService: SchoolService,
private readonly userService: UserService) {}
@ResolveField()
async users(@Parent() parent:School){
return this.userService.findBySchool(parent._id);
}
}
user.resolver.ts
import {
Resolver,
Query,
Mutation,
Args,
Int,
ResolveField,
Parent,
} from '@nestjs/graphql';
import { UserService } from './user.service';
import { User } from './entities/user.entity';
import { CreateUserInput } from './dto/create-user.input';
import { UpdateUserInput } from './dto/update-user.input';
import { SchoolService } from 'src/school/school.service';
import { School } from 'src/school/entities/school.entity';
@Resolver(() => User)
export class UserResolver {
constructor(
private readonly userService: UserService,
private readonly schoolService: SchoolService,
) {}
ResolveField(() => School)
async school(@Parent() parent: User) {
return await this.schoolService.findBySchool(parent.school._id);
}
}