希曼日记

Nestjs使用Mongoose与MongoDB交互

本页目录 5
  1. 注意事项
  2. 下载
  3. 导入Mongoose
  4. 定义Schema
  5. 定义控制器

注意事项

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