Mongoose操作MongoDB数据库(2):实现增、删、改、查基础操作

大家好,我是王嗨皮,一名主业前端,副业全栈的程序员,在这里我会分享关于前端进阶全栈的常用技术基本入门操作。 如果我的文章能让您有所收获,欢迎一键三连(评论,点赞,关注)。


本节内容,我们通过 mongoose 定义好数据模型,并实现对数据库增、删、改、查基本的操作。

定义数据模型

在项目根录下创建两个文件夹,分别命名为 modalrouter

其中 modal 文件夹下新建 modal.js 文件用来定义数据模型,router 文件夹下新建 router.js 文件方便后续创建增、删、改、查请求接口。

项目结构 复制代码
📦node_mongo
 ┣ 📂model
 ┃ ┗ 📜modal.js
 ┣ 📂router
 ┃ ┗ 📜router.js
 ┣ 📜.env
 ┣ 📜index.js
 ┗ 📜package.json

接下来,首先在 modal.js 中建立 Schema 数据文档。

Schema 是什么? 它类似于传统数据库中的表结构,定义了集合里每个文档中应该有的字段,以及这些字段的数据类型。

modal.js 复制代码
// 导入mongoose
import mongoose from 'mongoose'

// 创建Schema文档
const carSchema = new mongoose.Schema({
  type: String,
  brand: String,
  price: Number,
})

// 导出模型
export const carModel = mongoose.model('car', carSchema)

上述代码中,第一步先将 mongoose 核心依赖库导入。

其次以汽车为例,创建一个 carSchema 的实例对象,对象中包含 typebrandprice 三个字段,分别代表型号,品牌和价格,其中前两个为数据类型为String(字符串),价格的数据类型为Number(数字)

最后,使用 mongoose.model 将数据模型导出,方便接口的使用,mongoose.model 接收两个参数。

第一个参数 car 是MongoDB数据库下集合的名称(注意:集合创建时会名称自动修改为复数,比如代码中传递参数为 car,数据库集合的名称会变为 cars

第二个参数是 carSchema,就是之前创建的文档实例对象。

常用接口的创建

完成数据模型的定义后,我们来到 router 文件夹下,

首先创建一个 asyncHandler.js ,并定义一个简单的错误处理包装函数,统一处理错误格式。

asyncHandler.js 复制代码
// 异步错误处理包装函数
export const asyncHandler = (fn) => {
  return (req, res, next) => {
    Promise.resolve(fn(req, res, next)).catch((error) => {
      console.error('错误:', error.message)
      // 统一返回错误格式
      res.status(500).json({
        success: false,
        message: error.message || '服务器错误'
      })
    })
  }
}

之后把数据模型 carModel 和 异步处理函数 asyncHandler.js 导入 router.js

router.js 复制代码
import express from 'express'
const router = express.Router()

// 导入model
import { carModel } from '../model/modal.js'
// 导入错误处理包装函数
import { asyncHandler } from './asyncHandler.js'

接下来我们使用 Restful API 分别按顺序创建增、删、改、查四个接口并将路由导出,完整代码如下:

router.js 复制代码
// 新增汽车数据
router.post('/addCars', asyncHandler(async (req, res) => {
  const { type, brand, price } = req.body
  const car = new carModel({ type, brand, price })
  await car.save()
  res.json(car)
}))

// 删除汽车数据
router.delete('/deleteCars/:id', asyncHandler(async (req, res) => {
  //获取删除id
  const { id } = req.params
  await carModel.findByIdAndDelete(id)
  res.json({ message: '数据删除成功!' })
}))

// 更新汽车数据
router.put('/updateCars/:id', asyncHandler(async (req, res) => {
  //获取更新数据id
  const { id } = req.params
  const { type, brand, price } = req.body
  const car = await carModel.findByIdAndUpdate(id, { type, brand, price }, { new: true })
  res.json(car)
}))

// 查询所有汽车数据
router.get('/getAllCars', asyncHandler(async (req, res) => {
  const cars = await carModel.find()
  res.json(cars)
}))

// 导出路由
export default router

接口测试

最后,我们使用 Apifox 来测试一下接口和数据库是否正常运行。

先在项目根目录 index.js 里导入接口路由。

index.js 复制代码
// 导入路由
import router from './router/router.js'
// 将api设置为公共路径,不用每次都在路由前面加/api
app.use('/api', router)

使用终端进入项目根目录,执行 node index.js 启动服务。

我们以新增一条汽车数据接口为例,请求地址和传递参数参考下图:

点击 "发送" 请求,如果添加成功,我们可以在下方控制台看到返回的数据。

为了确认数据添加成功,可以使用 Navicat 登录数据库查看一下。

从上图可以看到在 test 数据库下已经成功建立了 cars 集合,并且有了一条数据。其它的接口大家可以自行进行测试。

到此,我们完成了使用 Mongoose 实现对数据库增删改查的基本操作。

下一节,我们将讲解聚合、条件查询、分页 排序等 Mongoose 对数据库的进阶操作。

如果我的文章能让您有所收获,欢迎一键三连(评论,点赞,关注),感谢!

相关推荐
WangHappy1 个月前
Windows搭建MongoDB(4):服务器部署及远程访问
mongodb·mongoose
NicolasCage2 个月前
mongoose学习笔记
mongoose
植物系青年8 个月前
前端玩数据库 👏 MongoDB/Mongoose 入门指南(下)
前端·mongodb·mongoose
植物系青年8 个月前
前端玩数据库 👏 MongoDB/Mongoose 入门指南(上)
前端·mongodb·mongoose
ziyu_jia1 年前
MongoDB、Mongoose使用教程
前端·数据库·mongodb·node.js·mongoose
花姐夫Jun1 年前
node.js基础学习-mongoose操作MongoDB(十二)
学习·mongodb·node.js·mongoose
云牧2 年前
使用 Mongoose 在 Node 和 Nest 中操作 MongoDB 数据库
前端·node.js·mongoose
耶耶耶耶耶~2 年前
mongoose httpserver浅析
网络·mongoose·网络通讯·httpserver