使用Schema First方法和NestJS在Mongoose中填充查询

时间:2019-07-02 01:35:07

标签: mongodb typescript mongoose nestjs

首先,我想说这个问题类似于引用this onethis one。除了明显的区别外,我和第二个链接有完全相同的问题。我正在尝试扩展由NestJS生成的定义属性的类。

我正在使用NestJs和发现here的Schema first方法。我还基于我的GraphQL模式生成了一个类文件。

以下是架构:

type Location {
  name: String!
  owner: User!
}

哪个生成类:

export class Location {
    name: string;
    owner: User;
}

现在,我想扩展此类,所以我不必重复数据(还有很多未显示的字段)。我还想添加存在于文档中但不在架构中的字段(在此示例中为_id)。这是我的LocationDocument和我的架构。

export interface LocationDocument extends Location, Document {
  _id: Types.ObjectId
}

export const LocationSchema: Schema = new Schema(
  {
    name: {
      type: String,
      required: true,
    },
    owner: {
      type: Types.ObjectId,
      ref: 'User',
    }
);

现在这是我的问题。从GraphQL模式生成的Location类将owner属性定义为User类型。但是实际上,在由Mongoose填充之前,它只是一个mongodb id。因此它可以是Types.ObjectId上的UserUserDocument。所以我尝试将其定义为:

export interface LocationDocument extends Location, Document {
  _id: Types.ObjectId
  owner: User | Types.ObjectId;
}

但是这在编译器中引发了一个错误,即LocationDocument错误地扩展了Location。这是有道理的。有什么方法可以扩展用户类,但可以说所有者属性可以是用户类型(由Mongoose填充)或mongo对象ID(存储在数据库中)。

1 个答案:

答案 0 :(得分:0)

我认为拥有可以同时使用两种类型的属性(虽然对Mongoose和JS易于使用)不是一种类型化的方式。在我的架构中,我有一个所有者,它是一个用户类型。在我的数据库和扩展它的文档中,我有一个OwnerId。因此,对于访问API的人们来说,他们并不关心这种关系的ownerId。但是在我的解析器中,我使用ID。一种是Mongo ID类型,另一种是用户类型。