如何在NestJS中创建Mongoose视图?代码示例及问题求助
在NestJS中配置Mongoose视图(对应原生Mongoose示例)
原生Mongoose代码回顾
const userSchema = new Schema({ name: String, email: String, }, { autoCreate: false, autoIndex: false }); const User = mongoose.model('User', userSchema); const RedactedUser = mongoose.model('RedactedUser', userSchema); await User.createCollection(); await RedactedUser.createCollection(...);
正确的NestJS实现方案
你之前的尝试失败,核心原因是错误地在useFactory中处理模型创建和集合初始化逻辑,且存在笔误(RedactedCat应为RedactedUser)。以下是正确的配置方式:
1. 单独定义Schema
创建user.schema.ts文件:
import { Schema } from 'mongoose'; export const UserSchema = new Schema({ name: String, email: String, }, { autoCreate: false, autoIndex: false });
2. 在模块中注册双模型并初始化集合
利用Nest的OnModuleInit钩子,在模块初始化时执行集合/视图创建逻辑:
// user.module.ts import { Module, OnModuleInit } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { UserSchema } from './user.schema'; import mongoose from 'mongoose'; @Module({ imports: [ MongooseModule.forFeature([ // 注册两个共享同一Schema的模型 { name: 'User', schema: UserSchema }, { name: 'RedactedUser', schema: UserSchema }, ]), ], }) export class UserModule implements OnModuleInit { async onModuleInit() { // 获取模型实例 const UserModel = mongoose.model('User', UserSchema); const RedactedUserModel = mongoose.model('RedactedUser', UserSchema); // 创建主集合 await UserModel.createCollection(); // 创建视图(传入你的视图配置参数,比如pipeline、viewOn等) await RedactedUserModel.createCollection(/* 你的视图配置 */); } }
关键说明
MongooseModule.forFeature负责将两个模型注册到Nest的依赖注入系统中,确保后续可以通过@InjectModel()注入使用。OnModuleInit钩子是执行集合初始化的合适时机,此时Mongoose与数据库的连接已完全建立。- 如果
RedactedUser是MongoDB视图,createCollection的参数需遵循MongoDB视图的配置规则,与原生Mongoose用法一致。
内容的提问来源于stack exchange,提问作者tran dinh thang
相关产品推荐
相关产品推荐

