一篇文章学会如何在 NestJS 中集成 MongoDB 并实现数据的增删改查操作

前言

在现代的Web应用程序开发中,无论是在数据存储、检索、还是数据流转的各个环节,数据库都扮演着极其重要的角色。MongoDB是一个基于分布式文件存储的开源数据库系统,以其高性能、高可用性和易扩展性著称。

作为JavaScript社区最受欢迎的后端框架之一,NestJS 提供了优雅的解决方案来与各种数据库进行交互,其中就包括了对MongoDB的支持。

本教程将通过一个简单而通俗的实例,带你在NestJS中集成MongoDB。我们将创建一个简易的用户管理系统,实现用户的增删改查操作。

准备工作

在开始之前,请确保你的开发环境中已经安装了以下软件:

  • Node.js(建议使用LTS版本)
  • npm 或 yarn(作为Node.js的包管理工具)
  • MongoDB(你可以在本机上安装MongoDB,或者使用MongoDB Atlas服务)
  • Nest CLI(通过 npm i -g @nestjs/cli 安装)

准备就绪后,我们可以开始动手编写代码了。

使用步骤

一、创建新的 NestJS 项目

使用 Nest CLI 创建一个新项目:

nest new nest-mongodb-example

进入项目目录:

cd nest-mongodb-example

二、安装 MongoDB 模块

在NestJS中操作MongoDB,我们将使用 @nestjs/mongoose模块,同时也需要安装mongoose:

npm install @nestjs/mongoose mongoose

三、配置 MongoDB 连接

我们需要配置NestJS应用来连接到MongoDB数据库。在 src目录下创建一个名为 configs的文件夹,并在其中创建 mongodb.config.ts文件:

// src/configs/mongodb.config.ts
export default {uri: 'mongodb://localhost/nest-mongodb-example',
};

app.module.ts中导入上述配置并初始化:

// src/app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import mongodbConfig from './configs/mongodb.config';@Module({imports: [MongooseModule.forRoot(mongodbConfig.uri),// ...其他模块],controllers: [],providers: [],
})
export class AppModule {}

四、创建数据模型 Schema

在 MongoDB 中, 我们使用 Schema 定义数据的结构。NestJS配合Mongoose可以让我们方便的操作它。

src目录下创建一个 users文件夹用来组织用户相关的文件。在其中创建 user.schema.ts用来定义用户数据模型:

// src/users/user.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';export type UserDocument = User & Document;@Schema()
export class User {@Prop({ required: true })username: string;@Prop()email: string;@Prop()age: number;
}export const UserSchema = SchemaFactory.createForClass(User);

五、注册数据模型

然后创建一个对应的服务模块来提供用户的业务逻辑:

nest g module users
nest g service users

这将会自动生成 users.module.tsusers.service.ts文件。

现在,我们将 User模型和 UserSchema导入到 UsersModule中:

// src/users/users.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from './user.schema';
import { UsersService } from './users.service';@Module({imports: [MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])],providers: [UsersService]
})
export class UsersModule {}

六、创建操作 MongoDB 的服务

现在,我们的 UsersService中可以通过依赖注入方式访问 User模型了。在 users.service.ts文件中,我们可以实现一些基本的数据库操作:

// src/users/users.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { User, UserDocument } from './user.schema';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';@Injectable()
export class UsersService {constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {}async create(createUserDto: CreateUserDto): Promise<User> {const createdUser = new this.userModel(createUserDto);return createdUser.save();}async findAll(): Promise<User[]> {return this.userModel.find().exec();}async findOne(id: string): Promise<User> {const user = this.userModel.findById(id).exec();if (!user) {throw new NotFoundException(`User with ID ${id} not found`);}return user;}async update(id: string, updateUserDto: UpdateUserDto): Promise<User> {const updatedUser = await this.userModel.findByIdAndUpdate(id, updateUserDto, { new: true }).exec();if (!updatedUser) {throw new NotFoundException(`User with ID ${id} not found`);}return updatedUser;}async delete(id: string): Promise<User> {const deletedUser = await this.userModel.findByIdAndRemove(id).exec();if (!deletedUser) {throw new NotFoundException(`User with ID ${id} not found`);}return deletedUser;}
}

七、实现增删改查操作

为了完成我们的CURD操作,我们还需要实现相应的 UsersController来处理HTTP请求。

此时我们同样应该创建DTO(Data Transfer Object)用来安全的传输数据。

首先,创建 create-user.dto.ts:

// src/users/dto/create-user.dto.ts
export class CreateUserDto {readonly username: string;readonly email?: string;readonly age?: number;
}// src/users/dto/update-user.dto.ts
import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';export class UpdateUserDto extends PartialType(CreateUserDto) {}

然后创建 UsersController:

nest g controller users

users.controller.ts中实现API的接口:

// src/users/users.controller.ts
import { Controller, Get, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { UsersService } from './users.service';
import { User } from './user.schema';@Controller('users')
export class UsersController {constructor(private readonly usersService: UsersService) {}@Post()async create(@Body() createUserDto: CreateUserDto): Promise<User> {return this.usersService.create(createUserDto);}@Get()async findAll(): Promise<User[]> {return this.usersService.findAll();}@Get(':id')async findOne(@Param('id') id: string): Promise<User> {return this.usersService.findOne(id);}@Put(':id')async update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto): Promise<User> {return this.usersService.update(id, updateUserDto);}@Delete(':id')async delete(@Param('id') id: string): Promise<User> {return this.usersService.delete(id);}
}

现在,我们把 UsersModule加入到 AppModule的imports数组里:

// src/app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import mongodbConfig from './configs/mongodb.config';
import { UsersModule } from './users/users.module';@Module({imports: [MongooseModule.forRoot(mongodbConfig.uri),UsersModule,// ...其他模块],// ...其他配置
})
export class AppModule {}

到这里,我们已经完成了NestJS与MongoDB的集成,以及一个用户增加和查询功能的简单例子。通过这样的方式,我们便实现了在NestJS中针对MongoDB的增删改查操作。下面是每个操作对应的功能:

  • POST /users 创建用户
  • GET /users 获取所有用户列表
  • GET /users/:id 根据ID获取单个用户
  • PUT /users/:id 根据ID更新用户信息
  • DELETE /users/:id 根据ID删除用户

结语

集成NestJS和MongoDB是一个相对直接的过程,感谢NestJS对于Mongoose的封装,使得我们可以非常便捷地管理数据库操作和数据模型。同时,我们可以享受到TypeScript的类型安全和装饰器带来的元数据功效,使得数据库相关代码更加清晰易懂。希望本教程可以帮助你在项目中快速集成NestJS和MongoDB,并构建出强大的后端服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java正则表达式大全(参考)

一、校验数字的表达式 1 数字&#xff1a;1$ 2 n位的数字&#xff1a;^\d{n}$ 3 至少n位的数字&#xff1a;^\d{n,}$ 4 m-n位的数字&#xff1a;^\d{m,n}$ 5 零和非零开头的数字&#xff1a;^(0|[1-9][0-9])$ 6 非零开头的最多带两位小数的数字&#xff1a;^([1-9][0-9])(.[0-…

普中STM32-PZ6806L开发板(HAL库函数实现-访问多个温度传感器DS18B20)

简介 我们知道多个DS18B20的DQ线是可以被挂在一起的, 也就是一根线上可以访问不同的DS18B20而不会造成数据错乱, 怎么做到的&#xff0c;其实数据手册都有说到&#xff0c; 就是靠64-bit ROM code 进行识别, 也可以理解成Serial Number进行识别, 因为主要差异还是在Serial Numb…

本地git服务器的使用

最后总结一句&#xff0c;用gitlab最省事&#xff0c;管理权限最方便&#xff0c;别像下文一样整了。 Windows上使用&#xff1a; 首先要在windows开发机上生成密钥&#xff1a; 1.安装git&#xff0c;首先去git官网下载git&#xff0c;https://git-scm.com/downloads&#xff…

初学者SkyWalking详细使用文档

SkyWalking使用文档 下载地址&#xff1a;https://skywalking.apache.org/downloads/ 主要下载&#xff1a;skywalking apm&#xff08;tar&#xff09; 、agents(tar) 解压&#xff1a; &#xff08;可选操作&#xff09;&#xff1a; ​ apache-skywalking-apm-bin --&g…

chromium在中文用户名下无法编译的问题

新电脑没有太注意&#xff0c;起用户名的时候用了中文。 在编译chromium104的代码时&#xff0c;因为环境变量有中文导致编译失败&#xff1a; 因为我的电脑默认是使用gbk编码&#xff0c;而不是utf-8编码。 这个问题有三种解决办法&#xff1a; &#xff08;一&#xff09;把…

并发编程:线程同步基础:3.2、使用两个线程模拟生产者和消费者执行任务。

目录 主要方法 1、主程序 2、生产者 3、消费者 4、中间队列&#xff08;主要代码&#xff09; 5、执行结果 主要方法 wait(); 线程等待notify(); 通知一个等待的线程notifyAll(); 通知所有等待的线程 1、主程序 package xyz.jangle.thread.test.n2_3.synccondition; /…

MySQL——事物

目录 一.发现问题 二.什么时事物 三.事务提交方式 四.事物的常规操作方式 五. 事务隔离级别 1.如何理解隔离性 2.隔离级别 3.查看与设置隔离性 4.读未提交【Read Uncommitted】 5.读提交【Read Committed】 6.可重复读【Repeatable Read】 7.串行化【serializabl…

云卷云舒:大型电信运营商应用软件健康度评估方法

大型电信运营商内均会自建云资源池&#xff0c;并基于云资源池构建自己上层应用软件资源&#xff0c;但是各类上层应用软件的故障频发也给运维工作带来了较大的压力&#xff0c;电信运营商急需一种较完善的方法实现对于应用软件的健康度评测&#xff0c;以进一步指导运维完成应…

14、应用层优化

常见问题 什么东西在消耗系统中每台主机的CPU、磁盘、网络&#xff0c;以及内存资源应用真的需要所有获取到的数据吗应用在处理本应由数据库处理的事情吗应用执行了太多的查询吗应用执行的查询太少吗应用创建了没必要的Mysql连接吗应用对一个Mysql实例创建连接的次数太多了吗应…

unity C# 中一看就会的try-catch-finally、throw

文章目录 1、C# 异常处理原理&#xff1a;2、C# 异常处理实用案例&#xff08;简化版示例&#xff09;&#xff1a;3、throw关键字 C# 异常处理是一种用于捕获和处理程序运行时错误的机制&#xff0c;它允许程序在遇到不可预见或非正常条件时进行优雅地恢复或失败。C# 中的异常…

MySQL模糊查询详解

MySQL模糊查询详解 一、什么是模糊查询二、MySQL中的模糊查询2.1 使用LIKE关键字2.2 使用正则表达式&#xff08;REGEXP&#xff09;2.3 使用BETWEEN AND2.4 使用IN操作符2.5 使用IS NULL操作符 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f49…

Rust 圣经 阅读 字符、布尔、单元类型

字符类型&#xff08;char&#xff09; Rust 的字符不仅仅是 ASCII &#xff0c;还包含所有的 Unicode 值&#xff0c;包括单个的中文、日文、表情符号等等。 Unicode 值的范围从 U0000 ~ UD7FF 和 UE000 ~ U10FFFF。 因为每个 Unicode 都是 4 个字节编码&#xff0c;所以字符…

【小白专用】c#之FileStream对象读写大文件

提及文件流&#xff0c;不得不先说以下几个类 FileStream&#xff0c;MemoryStream&#xff0c;NetWorkStream&#xff0c;StreamReader&#xff0c;StreamWriter&#xff0c;TextReader&#xff0c;TextWriter 在用这些类之前&#xff0c;我们先来了解一下这些类的用途以及区别…

知虾皮Shopee:东南亚最受欢迎的电子商务平台

在如今数字化时代&#xff0c;电子商务平台成为人们购物的首选方式。Shopee作为东南亚地区最受欢迎的电子商务平台&#xff0c;通过其多样化的商品、便捷的购物体验和创新的商业模式&#xff0c;迅速在该地区占据了重要地位。本文将详细介绍Shopee的特点和优势&#xff0c;以及…

设计模式 七大原则

1.单一职责原则 单一职责原则&#xff08;SRP&#xff1a;Single responsibility principle&#xff09;又称单一功能原则 核心&#xff1a;解耦和增强内聚性&#xff08;高内聚&#xff0c;低耦合&#xff09;。 描述&#xff1a; 类被修改的几率很大&#xff0c;因此应该专注…

CNN——VGG

1.VGG简介 论文下载地址&#xff1a;https://arxiv.org/pdf/1409.1556.pdf VGGNet 是由牛津大学视觉几何小组&#xff08;Visual Geometry Group, VGG&#xff09;提出的一种深层卷积网络结构&#xff0c;他们以 7.32% 的错误率赢得了 2014 年 ILSVRC 分类任务的亚军&#xff…

Prometheus 监控docker

查看docker运行状态 docker stats 启动docker cadvisor 直接运行docker docker run -d \--volume/:/rootfs:ro \--volume/var/run:/var/run:rw \--volume/sys:/sys:ro \--volume/var/lib/docker/:/var/lib/docker:ro \--publish8080:8080 \--namecadvisor \gcr.io/cadvisor…

2024年MySQL学习指南(二),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言4. DDL- 操作数据库4.1 查询4.2 创建数据库4.3 删除数据库4.4 使用数据库 5. DDL- 操作数据表5.1 数据类型5.2 查询表5.3 创建表5.4 删除表5.5 修改表 6. 实战案例详解 前言 接上一篇文章【2024年MySQL学习指南&#xff08;一&#xff09;】 4. DDL- 操作数据库 …

2023-2024 年广东省职业院校技能大赛高职组 “软件测试”赛项竞赛规程

2023-2024 年广东省职业院校技能大赛&#xff08;高职组&#xff09; “软件测试”赛项竞赛规程 一、赛项信息 赛项名称&#xff1a;软件测试 赛项编号&#xff1a;GZ034 赛项组别&#xff1a;高职组 二、竞赛目标 软件是新一代信息技术的灵魂&#xff0c;是数字经济发展的基础…

AWS ECS、EC2、EKS 和 Fargate 之间的关系

ECS (Elastic Container Service), EC2 (Elastic Compute Cloud), EKS (Elastic Kubernetes Service), 和 Fargate 是亚马逊 AWS 云平台上的服务&#xff0c;用于容器化应用程序的部署和管理。这些服务之间有一些关联&#xff0c;但它们在实现容器化工作负载的方式上有所不同。…