Skip to main content

Nestjs使用Mongoose与MongoDB交互

注意事项

创建Schema数据模型时, 映射的类型是该类名的复数, 例如使用Cat作为类名, 那么mongoose就回去寻找mongodb数据库中的同名复数数据库cats

下载

pnpm add -S @nest/mongoose mongoose

导入Mongoose

  1. @nestjs/mongoose导入mongoose模块
  2. 使用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

  1. 导入mongoose的模型User.nameUser, 即类名,schema数据模型, 在schemas目录定义的数据模型
  2. 导入Service
  3. 导入控制器
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 {}