【Nestjs学习日记】连接MongoDB表

作者:markzzw 时间:2024-2-26

线上代码:CodeSandbox

Github:zhangzewei/nest-learning-tutorial
系列阅读 【Nestjs学习日记】专栏

在 NestJS 中使用 MongoDB 数据库时,连接到数据库只是第一步。接下来,我们需要连接到具体的 MongoDB 表(集合),以便执行数据操作。NestJS 提供了一种简单且优雅的方式来定义和操作 MongoDB 表。

在本篇学习日记中,我们将探讨如何在 NestJS 中连接到 MongoDB 表,并执行常见的数据操作,如插入、查询、更新和删除数据。

准备工作

在开始之前,确保您已经完成了以下准备工作:

  • 已经连接到 MongoDB 数据库:请参考前一篇学习日记中的内容,确保您已经成功连接到 MongoDB 数据库。
  • 安装必要的依赖:我们将使用 @nestjs/mongoose 包来连接和操作 MongoDB 表。如果还没有安装该包,请运行以下命令进行安装:
shell 复制代码
  npm install --save @nestjs/mongoose mongoose

完成上述准备工作后,我们就可以开始连接到 MongoDB 表并进行数据操作了。

连接数据库表

连接MongoDB的表需要用到 MongooseModule 提供的 forFeature 方法。

php 复制代码
MongooseModule.forFeature([{ name: 'Cat', schema: CatSchema }]),

在 mongoDB 中,Schema 是一个表结构的展示,所以我们需要定义一个 Schema。

创建一个 CatSchema.ts

ts 复制代码
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';

export type CatDocument = HydratedDocument<Cat>;

@Schema()
export class Cat {
    @Prop()
    name: string;

    @Prop()
    age: number;

    @Prop()
    foods: string[];
}

export const CatSchema = SchemaFactory.createForClass(Cat);

随后在 cat.module.ts 中 import的数组中添加上 MongooseModule.forFeature([{ name: 'Cat', schema: CatSchema }])

ts 复制代码
import { Module } from '@nestjs/common';
import { CatController } from './cat.controller';
import { CatService } from './cat.service';
import { MongooseModule } from '@nestjs/mongoose';
import { Cat, CatSchema } from './schema/cat.schema';

@Module({
  imports: [
    MongooseModule.forFeature([{
      name: Cat.name, // 表名字
      schema: CatSchema // 表结构
    }]),
  ],
  controllers: [CatController],
  providers: [CatService],
  exports: [CatService],
})
export class CatModule { }

再将 cat.service.ts 中添加用于操作 cat 表的 Module。Models 是从 Schema 编译来的构造函数。 它们的实例就代表着可以从数据库保存和读取的 documents。 从数据库创建和读取 document 的所有操作都是通过 model 进行的。

ts 复制代码
import { Injectable } from '@nestjs/common';
import { Cat } from './schema/cat.schema';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { CreateCatDto } from './dto/cat.dto';

@Injectable()
export class CatService {
  isChanged = false;
  constructor(
    @InjectModel(Cat.name) private catModel: Model<Cat> // 创建操作数据库的Module
  ) {}

  // 创建一条数据
  async create(createCatDto: CreateCatDto) {
    const createdCat = new this.catModel(createCatDto);
    return createdCat.save();
  }

  // 获取所有数据
  async findAll() {
    const cats = await this.catModel.find();
    return cats;
  }
}

把 cat service 中的 create 函数应用到 cat 的 post 方法,findAll 函数应用到 cat 的 get 方法,由此来验证数据库表的创建和获取是否成功。

cat.controller.ts

ts 复制代码
import { Controller, Get, Body, Post, Param, Put } from '@nestjs/common';
import { CatService } from './cat.service';
import { CreateCatDto, UpdateCatDto } from './dto/cat.dto';

@Controller('cat')
export class CatController {
  constructor(private catService: CatService) { }
  @Get()
  getCats() {
    return this.catService.findAll();
  }

  @Post()
  createCat(@Body() body: CreateCatDto) {
    return this.catService.create(body);
  }
}

验证

最开始在 Cloud MongoDB 查看数据库是没有任何数据。

随后在 postman 中进行 post 请求

随后刷新 Cloud MongoDB 中的数据库页面可以看到已经创建了一个 pets 数据库和 cats 表,并且已经存入了刚才请求的post的数据。

相关推荐
小二·10 小时前
Python Web 开发进阶实战 :AI 原生数字孪生 —— 在 Flask + Three.js 中构建物理世界实时仿真与优化平台
前端·人工智能·python
Whisper_Sy10 小时前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 网络状态实现
android·java·开发语言·javascript·网络·flutter·php
新缸中之脑11 小时前
Weave.js:开源实时白板库
开发语言·javascript·开源
Amumu1213811 小时前
Vue组件化编程
前端·javascript·vue.js
We་ct11 小时前
LeetCode 6. Z 字形变换:两种解法深度解析与优化
前端·算法·leetcode·typescript
小二·12 小时前
Python Web 开发进阶实战(终章):从单体应用到 AI 原生生态 —— 45 篇技术演进全景与未来开发者生存指南
前端·人工智能·python
m0_6372565812 小时前
vue-baidu-map添加了类型组件导致非常卡顿的问题
前端·javascript·vue.js
雨季66612 小时前
基于设备特征的响应式 UI 构建:Flutter for OpenHarmony 中的智能布局实践
javascript·flutter·ui
挂机且五杀12 小时前
为什么在React地图组件里,memo 不是优化,而是生存?
前端·react.js·前端框架
RFCEO12 小时前
HTML编程 课程七、:HTML5 新增表单标签与属性
前端·html·html5·搜索框·手机号·邮箱验证·日期选择