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 {}