猫鼬与 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"
举个例子,我将使用本期中的模式(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()
【讨论】:
以上是关于猫鼬与 NestJS - 一对多的主要内容,如果未能解决你的问题,请参考以下文章