gpt4 book ai didi

node.js - Mongoose 与 NestJS - 一对多

转载 作者:搜寻专家 更新时间:2023-10-30 21:57:31 24 4
gpt4 key购买 nike

我有一个问题,我无法通过 Mongoose 获得 2 个模式之间的关系,我是使用它的新用户,我正在使用 NestJS,这是一个使用 TypeScript 的 NodeJS 框架。

我有这些文件:

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

因此,关系已创建,我可以看到它,但我不知道如何获取用户模式的子级。在我的 ts 中我有这个:

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

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

如果有任何反馈或者我必须说清楚的话,我将不胜感激。

最佳答案

我用这种方式解决了一对多关系的问题:

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. 创建用户 架构
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()

}
}

关于node.js - Mongoose 与 NestJS - 一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52230301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com