Nestjs使用Mongoose与MongoDB交互
注意事项
创建Schema数据模型时, 映射的类型是该类名的复数, 例如使用Cat作为类名, 那么mongoose就回去寻找mongodb数据库中的同名复数数据库
cats
下载
pnpm add -S @nest/mongoose mongoose导入Mongoose
- 从
@nestjs/mongoose导入mongoose模块 - 使用
forRoot链接mongodb数据库, 例如mongodb://root:admin@192.168.0.152:27017/edu_system
app.module.ts
@Module({ imports: [MongooseModule.forRoot('mongodb-url')]})定义Schema
! 创建
Schema数据模型时, 映射的类型是该类名的复数, 例如使用Cat作为类名, 那么mongoose就回去寻找mongodb数据库中的同名复数数据库cats
如果不想再数据库更新已有的表, 那么需要再
Schema这个装饰器中添加参数:collectio:n : '表名'
更多Schema参数
例子:
@Schema({ collection: 'user_student' })schemas/user.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';// 定义文档(表)字段的类型export type UserDocument = HydratedDocument<User>
Schema({ collection: 'user' })export class User { @Prop() key1: type1
@Prop() key2: type2}
export const UserSchema = SchemaFactory.createForClass(User) // 导出模型定义控制器
user.controller.ts
import { Controller, Get, Query } from '@nestjs/common';import { UserService } from './user.service';
@Controller('user')export class UserController { constructor(private readonly userService: UserService) {}
// 根据id查询用户 @Get() find(@Query() query: { id: string }) { return this.userService.find(query?.id); }}定义Service
user.serive.ts
import { Injectable } from '@nestjs/common';import { InjectModel } from '@nestjs/mongoose';import { User, UserDocument } from '../schemas/user.schema';import { Model } from 'mongoose';
@Injectable()export class UserService { constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {}
// 根据id查询用户 async find(id: string): Promise<User[]> { return await this.userModel.find({ id }).exec(); }}定义Module
- 导入
mongoose的模型User.name为User, 即类名,schema数据模型, 在schemas目录定义的数据模型 - 导入Service
- 导入控制器
import { Module } from '@nestjs/common';import { MongooseModule } from '@nestjs/mongoose';import { User, UserSchema } from '../schemas/user.schema';import { UserController } from '../user/user.controller';import { UserService } from '../user/user.service';
console.log(User.name);@Module({ imports: [ MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]), ], controllers: [UserController], providers: [UserService],})export class UserModule {}