我已经通过这种方式解决了 ONE-TO-MANY 关系的问题:
package.json:
"@nestjs/mongoose": "7.0.2"
"mongoose": "^5.10.14"
举个例子,我将使用本期中的模式(User 和 Token):
- 创建
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()
}
}