猫鼬与 NestJS - 一对多

Jos*_*aza 4 mongoose node.js typescript nestjs

我有一个问题,我无法使用 Mongoose 获取 2 个模式之间的关系,我是使用它的新用户,我使用的是 NestJS,这是一个使用 TypeScript 的 NodeJS 框架。

我有这些文件:

user.schema.ts

import * as mongoose from 'mongoose';

export const UserSchema = new mongoose.Schema({
    name: String,
    email: String,
    role: Number,
    tokens: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Token'}]
});
Run Code Online (Sandbox Code Playgroud)

token.schema.ts

import * as mongoose from 'mongoose';

export const TokenSchema = new mongoose.Schema({
    token: String,
    refreshToken: String,
    createdAt: String,
    expiresAt: String,
    isValid: Boolean,
    userId: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User'}]
});
Run Code Online (Sandbox Code Playgroud)

因此,关系已创建,我可以看到它,但我不知道如何获取 User 架构的子项。在我的 ts 我有这个:

await this.userModel.find().populate('user', 'tokens').exec()
Run Code Online (Sandbox Code Playgroud)

据我所知,这是为了获得两个模式之间的关系。顺便说一句:集合是用户和令牌。

我将不胜感激任何反馈或如果我必须说清楚。

Edu*_*que 6

我已经通过这种方式解决了一对多关系的问题:

包.json:

"@nestjs/mongoose": "7.0.2"
"mongoose": "^5.10.14"
Run Code Online (Sandbox Code Playgroud)

举个例子,我将使用这个问题(UserToken)中的模式:

  1. 创建Token模式
"@nestjs/mongoose": "7.0.2"
"mongoose": "^5.10.14"
Run Code Online (Sandbox Code Playgroud)
  1. Token架构添加到TokenModule
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';

@Schema({_id: false})
export class Token {

  @Prop({type: Types.ObjectId})
  _id: Types.ObjectId;

  @Prop()
  token: string;

  @Prop()
  refreshToken: string;

  @Prop()
  createdAt: Date; // You can use Date here.

  @Prop()
  expiresAt: Date;

  @Prop()
  isValid: boolean;
}

export const TokenSchema = SchemaFactory.createForClass(Token);
Run Code Online (Sandbox Code Playgroud)
  1. 创建User模式
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forFeature([
      { name: Token.name, schema: TokenSchema },
    ]),
  ],
  // ...
})
export class TokenModule {}
Run Code Online (Sandbox Code Playgroud)
  1. User架构添加到UserModule
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';

export type UserDocument = User & Document;

@Schema({_id: false})
export class User {

  @Prop({type: Types.ObjectId})
  _id: Types.ObjectId;

  @Prop()
  name: string;

  @Prop()
  email: string;

  @Prop()
  role: number;

  @Prop(type: [Types.ObjectId], ref: Token.name)
  tokens: Token[];
}

export const UserSchema = SchemaFactory.createForClass(User);
Run Code Online (Sandbox Code Playgroud)
  1. populate函数中使用UserService
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forFeature([
      { name: User.name, schema: UserSchema },
    ]),
  ],
  // ...
})
export class UserModule {}
Run Code Online (Sandbox Code Playgroud)