猫鼬与 NestJS - 一对多

Posted

技术标签:

【中文标题】猫鼬与 NestJS - 一对多【英文标题】:Mongoose with NestJS - One to Many 【发布时间】: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 个模式之间的关系。 顺便说一句:集合是用户和令牌。

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

【问题讨论】:

【参考方案1】:

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

package.json:

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

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

    创建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);
    Token 架构添加到TokenModule
import  MongooseModule  from '@nestjs/mongoose';

@Module(
  imports: [
    MongooseModule.forFeature([
       name: Token.name, schema: TokenSchema ,
    ]),
  ],
  // ...
)
export class TokenModule 
    创建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);
    User 架构添加到UserModule
import  MongooseModule  from '@nestjs/mongoose';

@Module(
  imports: [
    MongooseModule.forFeature([
       name: User.name, schema: UserSchema ,
    ]),
  ],
  // ...
)
export class UserModule 
    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()

  

【讨论】:

以上是关于猫鼬与 NestJS - 一对多的主要内容,如果未能解决你的问题,请参考以下文章

如何使用父引用填充猫鼬中的一对多关系?

NestJS-Prisma,如何编写与 prisma 一对多类型匹配的 DTO

MyBatis高级篇 - 关联查询(一对多)

Laravel 一对多关系和一对一关系

数据库一对一对多多对多关系

Hibernate一对多实例