使用mongoose在express中操作数据库

news/2024/7/24 4:50:21 标签: mongodb, node.js

文章目录

  • 前言
  • 一、Mongoose是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.连接数据库
    • 3.操作数据库
      • 操作前的准备工作
      • 增加文档
      • 查询文档
      • 更新文档
      • 删除文档
    • 3.将增删查改操作写成接口
  • 总结


前言

前面我们已经学会怎么去在命令行里操作数据库了,但是我们肯定不能让用户去操作命令行吧。现在我们就来学习一下怎么使用mongoose在express中操作mongoDB并编写出可用接口!

一、Mongoose是什么?

  • Mongoose就是一个我们可以通过Node来操作MongoDB的模块。
  • Mongoose是一个对象文档库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。
  • 大多数情况下,它被用来把结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换等好处。

二、使用步骤

1.引入库

// 下载安装mongoose
npm i mongoose --save
// 在项目中引入mongoose
const mongoose = require('mongoose');

2.连接数据库

// 连接数据库(端口号为默认的27017可不写)
mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名')

根据提示,我们了解到后面还需添加参数,否则会报错(不影响)

mongoose.connect('mongodb://localhost/test',{ useNewUrlParser: true,useUnifiedTopology: true })
// 监听数据库的连接成功回调
mongoose.connection.once('open',() => {
  console.log('数据库连接成功');
})
// 监听数据库的断开回调
mongoose.connection.once('close',() => {
  console.log('数据库断开成功');
})
// 断开数据库(一般不需要断开)
mongoose.disconnect()

3.操作数据库

操作前的准备工作

创建约束表:

const Schema = mongoose.Schema
// 创建一个student模式对象
const student = new Schema({
  name:String,
  age:Number,
  sex:{
    type:String,
    default:'男'
  },
  address:String
})

可以直接定义类型,或用对象的形式定义类型和默认值

使用schema来创建model

// mongoose.model(映射的集合名,约束表)
const stuModel = mongoose.model('stus',student)

model代表是数据库中的集合,通过model才能对数据库进行操作。

增加文档

// 用来增加一个文档并添加到数据库里,可以传一个或多个对象,多个用数组表示
model.create(约束表对象,回调函数)

让我们来试一试

stuModel.create({
  name:'小明',
  age:12,
  sex:'男',
  address:'东土大唐'
},err => {
  if (!err) {
    console.log('插入成功');
  }
})

结果:
在这里插入图片描述
在这里插入图片描述
注意:操作会将自动创建的集合名变为复数形式。

查询文档

// 投影为一个对象,里面设置需要投影的值,需要设置为1,_id会自带,不想要需设置为0
model.find(查询条件,投影,查询选项(skip,limit),回调函数(必须))

让我们来试一试:

stuModel.find({
  sex:'男'
},(err,data) => {
  if(!err) {
    console.log(data);
  }
})

结果:在这里插入图片描述
可以看到我们已经查询到了相应数据。

注意:data一定会返回一个数组,如查询不到则返回空数组

试一试加投影:

stuModel.find({
  sex:'男'
},{
  name:1,
  _id:0
},(err,data) => {
  if(!err) {
    console.log(data);
  }
})

结果:
在这里插入图片描述
model.findOne():用法一样,只返回第一个符合的查询对象
model.findById():查询条件为_id,其余用法一样

更新文档

model.updateOne(查询条件,修改后对象,查询选项(skip,limit),回调函数(必须))

model.updateMany(查询条件,修改后对象,查询选项(skip,limit),回调函数(必须))

让我们来试一试:

stuModel.updateMany({sex:'男'},{$set:{name:'冷锋'}},(err,data) => {
  if(!err) {
    console.log(data);
  }
})

结果:
在这里插入图片描述
可以看到已经修改成功啦

删除文档

model.deleteOne(查询条件,回调函数(必须))

model.deleteMany(查询条件,回调函数(必须))

让我们来试一试:

stuModel.deleteOne({sex:'男'},(err,data) => {
  if(!err) {
    console.log(data);
  }
})

结果:
在这里插入图片描述
看到已经删除成功咯

3.将增删查改操作写成接口

刚刚我们已经知道了怎么在node里面操作数据库,现在我们将他们与express结合起来暴露出接口吧!

const express = require('express');
const app = express()
//引入中间件
const bodyParser = require('body-parser')
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test',{ useNewUrlParser: true,useUnifiedTopology: true })

mongoose.connection.once('open',() => {
  console.log('数据库连接成功');
})
const Schema = mongoose.Schema
// 创建一个student模式对象
const student = new Schema({
  name:String,
  age:Number,
  sex:{
    type:String,
    default:'男'
  },
  address:String
})
const stuModel = mongoose.model('stus',student)
// 请求体解析中间件
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// 增加
app.get('/add',(req,res) => {
  stuModel.create(req.body,(err,data) => {
    if(!err) {
      res.send('创建成功')
    }
  })
})

// 删除
app.get('/delete',(req,res) => {
  stuModel.deleteMany(req.body,(err,data) => {
    if(!err) {
      res.send('删除成功')
    }
  })
})
// 查询
app.get('/search',(req,res) => {
  stuModel.find(req.body,(err,data) => {
    if(!err) {
      res.send(data)
    }
  })
})

// 查询
app.get('/update',(req,res) => {
  stuModel.updateMany(req.body,{$set:{age:100}},(err,data) => {
    if(!err) {
      res.send(data)
    }
  })
})

app.listen(3000,() => {
  console.log(`端口3000已开放监听,请求地址localhost:3000`);
})

让我们分别测试下几个接口吧!

增加:在这里插入图片描述
在这里插入图片描述
可以看到我们的数据库是能查到的。

查询:
在这里插入图片描述
可以看到查询成功

修改:
在这里插入图片描述
在这里插入图片描述

可以看到我们的age已经被修改为100了

删除:在这里插入图片描述
在这里插入图片描述
可以看到我们的数据已经被清除掉了

总结

以上就是今天要讲的内容,本文仅仅简单介绍了mongoose的使用,以及mongoDB配合express使用的方法,更多的还需要同学们自己去实验


http://www.niftyadmin.cn/n/861674.html

相关文章

浅谈xss和csrf攻击

文章目录前言一、XSS是什么?存储型(持久型)反射型(非持久型)dom型二、CSRF是什么?总结前言 由于博主目前在一家主做网络安全的公司实习,之前没有意识到网络安全的严重性,现在才感受到我们的系统存在了这么多问题,很容…

【ES6】浅谈Vue3为什么使用Proxy取代defineProperty

文章目录前言一、Proxy是什么?get()set()二、Vue双向绑定实现原理三、Vue3为什么使用ProxydefineProperty缺陷Proxy的好处总结前言 友友们大家好,vue3推出后大家有没有去看呢?博主是个性子急的人,哪能禁得住这诱惑。 经过博主粗…

【ES6】浅谈Generator和yield

文章目录前言一、async await实现二、Generator实现三、Generator函数1、什么是Generator2.Generator的特点3.Generator的执行四、yield表达式1、什么是yield2、yield注意点五、Iterator对象五、next方法的参数总结前言 问题发生在一个下午,当我正在实现Promise.al…

常见css居中问题

文章目录前言一、水平居中已知宽度未知宽度二、垂直居中已知高度未知高度三、垂直水平居中总结前言 居中是我们项目开发中最常用到样式,可以说,作为一名合格的前端,各种情况下的居中应该是得心应手的,接下来让我们看看有哪些方式…

【JS编译原理】V8执行JavaScript代码过程

文章目录前言一、编译器和解释器二、V8执行JavaScript代码过程1.生成AST(抽象语法树)2.生成字节码3.生成机器码总结前言 相信大家对Babel已经不陌生了,Babel充斥在我们代码中的每个角落。比如:jsx转化成js,es6转化成e…

【React Hooks优化】减少重复渲染

文章目录前言一、为什么要进行优化?React的默认渲染行为二、使用memo/useMemo缓存组件1.memo2.useMemo2.useCallback总结前言 事情发生在一个下午,我需要用React hooks写一个定时器,因为useEffect每次执行都会使组件重新渲染一次&#xff0c…

【前端怪谈】两个行内块元素之间的间距问题

文章目录前言一、问题描述二、解决方式1.使用浮动2.清除行内块元素之间的空格和换行符3.父元素设置font-size:03.父元素设置word-spacing总结前言 相信行内块元素,也就是display:inline-block的元素大家并不少见,不知道大家有没有发现一个问题,就是当两个行内块元素在同一行并…

【前端怪谈】js中为什么0.1+0.2 !== 0.3

文章目录前言一、问题原因二、解决办法三、大数相加1、BigInt2、大数相加总结前言 下面大家先来看一下这行诡异的代码,猜猜会输出什么 console.log(0.1 0.2);是不是和所想的不太一样?下面我们来探索一下为什么它会这样吧。 一、问题原因 在计算机中…