NestJS + Mongoose + GraphQL:“填充”不起作用

sto*_*nie 3 mongoose mongodb mongoose-populate graphql nestjs

感谢伟大的框架!

我将 mongoose 与 GraphQL 结合使用并遇到以下问题:

如果我想用 来解析存储在用户的数组“参数”中的 ObjectID populate,在 GraphQL 中我会得到一个空参数数组作为答案的用户。

ArgumentSchema我怀疑定义引用(MongoDB 模式的名称)或填充arguments(用户属性的名称)时出现错误。这是如何正确工作的?

论证模式

export const ArgumentSchema = new mongoose.Schema({
  argument: { type: String, required: true },
  userId: { type: String, required: true },
  username: { type: String, required: true },
});
Run Code Online (Sandbox Code Playgroud)

用户模式

export const UserSchema = new mongoose.Schema({
  username: { type: String, required: true },
  email: { type: String, required: true },
  age: { type: Number, required: true },
  arguments: { type: [mongoose.Schema.Types.ObjectId], required: false, ref: 'ArgumentSchema' },
});
Run Code Online (Sandbox Code Playgroud)

论证.模型

@ObjectType()
export class ArgumentGQL {
  @Field(() => ID)
  readonly _id: string;

  @Field()
  readonly argument: string;

  @Field()
  readonly userId: string;

  @Field()
  readonly username: string;
}
Run Code Online (Sandbox Code Playgroud)

用户模型

@ObjectType()
export class UserGQL {
  @Field(() => ID)
  readonly _id: string;

  @Field()
  readonly username: string;

  @Field()
  readonly email: string;

  @Field()
  readonly age: number;

  @Field(() => [ArgumentGQL], { nullable: true })
  readonly arguments: ArgumentGQL[];
}
Run Code Online (Sandbox Code Playgroud)

用户服务

async getOne(id: string): Promise<UserGQL> {
    try {
      return await this.userModel.findById(id).populate('arguments').exec();
    } catch (e) {
      throw new BadRequestException(e);
    }
  }
Run Code Online (Sandbox Code Playgroud)

GraphlQL 查询示例

query {
  getUser(id: "5dbcaf9f5ba1eb2de93a9301") {
      _id,
      username,
      email,
      age,
      arguments {
          argument,
          username
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想我还没有理解一些基本的东西......

我将不胜感激任何帮助!干杯

Poo*_*ian 5

我想问题可能出在你定义的方式上user.schema。正如这里提到的,你尝试过这个吗?

{
 arguments: [{ type: [mongoose.Schema.Types.ObjectId], , ref: 'ArgumentSchema' }],
}
Run Code Online (Sandbox Code Playgroud)