node.js - Mongoose med NestJS - Én til mange


Jeg har et problem, jeg klarer ikke å få forholdet mellom 2 skjemaer med Mongoose, jeg er en ny bruker som bruker dette, jeg bruker NestJS, det er et NodeJS-rammeverk som bruker TypeScript.

Jeg har disse filene:

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

Så, relasjonen er opprettet, jeg kan se den, men jeg vet ikke hvordan jeg skal få tak i barna til Bruker-skjemaet. I min ts har jeg dette:

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

Siden jeg vet at det er for å få forholdet mellom de to skjemaene. Forresten: Samlingene er brukere og tokens.

Jeg vil sette pris på enhver tilbakemelding, eller om jeg må gjøre noe klart.

Svar #1

Jeg har løst problemet mitt med EN-til-MANGE-forhold på denne måten:

package.json:

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

For å lage et eksempel, vil jeg bruke skjemaene fra denne saken (User og Token):

  1. Opprette Token-skjema
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. Legger til Token-skjema i TokenModule
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forFeature([
      { name: Token.name, schema: TokenSchema },
    ]),
  ],
  // ...
})
export class TokenModule {}
  1. Opprette User Skjema
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. Legger til User-skjema i UserModule
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forFeature([
      { name: User.name, schema: UserSchema },
    ]),
  ],
  // ...
})
export class UserModule {}
  1. Bruke populate-funksjonen i UserService
@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()

  }
}

Relaterte artikler