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):
- 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);
- Legger til
Token-skjema iTokenModule
import { MongooseModule } from '@nestjs/mongoose';
@Module({
imports: [
MongooseModule.forFeature([
{ name: Token.name, schema: TokenSchema },
]),
],
// ...
})
export class TokenModule {}
- Opprette
UserSkjema
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);
- Legger til
User-skjema iUserModule
import { MongooseModule } from '@nestjs/mongoose';
@Module({
imports: [
MongooseModule.forFeature([
{ name: User.name, schema: UserSchema },
]),
],
// ...
})
export class UserModule {}
- Bruke
populate-funksjonen iUserService
@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()
}
}
