【问题标题】:Mongoose with NestJS - One to Many猫鼬与 NestJS - 一对多
【发布时间】:2019-02-13 06:22:23
【问题描述】:

我有一个问题,我无法使用 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'}]
});

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'}]
});

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

await this.userModel.find().populate('user', 'tokens').exec()

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

如果我有任何反馈,或者我必须澄清一些事情,我将不胜感激。

【问题讨论】:

    标签: node.js typescript mongoose nestjs


    【解决方案1】:

    我已经通过这种方式解决了 ONE-TO-MANY 关系的问题:

    package.json:

    "@nestjs/mongoose": "7.0.2"
    "mongoose": "^5.10.14"
    

    举个例子,我将使用本期中的模式(UserToken):

    1. 创建Token 架构
    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);
    
    1. Token 架构添加到TokenModule
    import { MongooseModule } from '@nestjs/mongoose';
    
    @Module({
      imports: [
        MongooseModule.forFeature([
          { name: Token.name, schema: TokenSchema },
        ]),
      ],
      // ...
    })
    export class TokenModule {}
    
    1. 创建User 架构
    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);
    
    1. User 架构添加到UserModule
    import { MongooseModule } from '@nestjs/mongoose';
    
    @Module({
      imports: [
        MongooseModule.forFeature([
          { name: User.name, schema: UserSchema },
        ]),
      ],
      // ...
    })
    export class UserModule {}
    
    1. UserService 中使用populate 函数
    
    @Injectable()
    export class UserService {
    
      constructor(
        @InjectModel(User.name) private userModel: Model<UserDocument>,
      ) {}
    
      async getUserWithPopulate(id: string) {
        // Here is the ace in the hole, you need to specify the path (tokens) and the model (Token.name).
        await this.userModel
          .find()
          .populate('tokens', null, Token.name)
          .exec()
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-22
      • 2018-08-29
      • 2018-01-22
      • 2018-08-23
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多