Express操作MongoDB【一.Express框架通过Mongoose模块操作MongoDB数据库;二.在接口中间件中使用Mongoose模块】

news2024/11/26 14:27:33

目录

一.Express框架通过Mongoose模块操作MongoDB数据库

1.MongoDB数据库:

(1)存放数据的格式:key:value

(2)数据库(database)---集合(collection)---文档(document)

(3)是众多NoSQL数据库中的一款:非关系型数据库,不能使用SQL语句对数据库进行操作

2.Mongoose模块

(1)是一个对象模型工具,是对Node.js环境下操作MongoDB数据库进行了封装,可以将MongDB数据库中的数据转换成JavaScript对象供用户使用

(2)名词:

(3)命名规范:驼峰命名,例如:

3.Mongoose模块的使用

(1)安装:npm install mongoose

(2)创建数据库连接文件

(3)创建Schema(表示集合的骨架),再由Schema创建Model

4.mongoose的基本操作

(1)插入文档:save方法

(2)删除文档:findByIdAndDelete,直接通过Model调用,作用是根据文档的_id属性删除

(3)删除文档:deleteOne,直接通过Model调用,根据给定的条件删除文档

(4)更新文档:findOneAndUpdate,直接通过Model调用

        findOneAndUpdate(条件,更新语句,{},回调函数)

(5)updateOne(条件,更新语句,回调函数)

(6)查询所有:find()

(7)按_id查询:findById()

(8)多条件查询:findOne() ===> 返回满足条件的第一条记录

(9)查询集合中的文档数(记录数):count

二.在接口中间件中使用Mongoose模块


一.Express框架通过Mongoose模块操作MongoDB数据库

1.MongoDB数据库:

(1)存放数据的格式:key:value

(2)数据库(database)---集合(collection)---文档(document)

(3)是众多NoSQL数据库中的一款:非关系型数据库,不能使用SQL语句对数据库进行操作

2.Mongoose模块

(1)是一个对象模型工具,是对Node.js环境下操作MongoDB数据库进行了封装,可以将MongDB数据库中的数据转换成JavaScript对象供用户使用

(2)名词:

a.Schema:它是一种以文件形式存储的数据库模型骨架,不具备对数据库操作的能力,仅仅只是数据库在程序片段中的一种表现,可以理解为表结构,实现一种映射。

b.Model:由Schema发布生成的模型,具有抽象属性和行为的数据库操作

c.Entity:由Model创建的实体,它的操作也会影响数据库

(3)命名规范:驼峰命名,例如:

        PersonSchema:Person对应的Schema,Person的文本属性(表结构)

        PersonModel:Person对应的模型。

        PersonEntity:Person对应的实体

Schema生成Model,由Model生成Entity,Model和Entity都可以操作数据库,Model的可操作性更强

3.Mongoose模块的使用

(1)安装:npm install mongoose

(2)创建数据库连接文件

//1.导入mongooose模块
const Mongoose = require('mongoose');
//2.定义MongDB数据库的连接字符串:协议://主机地址:端口号/数据库名
const mdb_url = 'mongodb://localhost:27017/my_test'
//3.建立和MongDB数据库的连接:
// useNewUrlParser:true  是否使用新的url地址转换方式
// useUnifiedTopology:true  是否使用新的用户安全策略
Mongoose.connect(mdb_url,{useNewUrlParser:true,useUnifiedTopology:true})
// 4.对连接过程进行处理
//4.1建立连接-----连接成功会触发connected事件
Mongoose.connection.on('connected',function (){
    console.log('数据库连接成功!!!连接地址是:'+mdb_url)
})
//4.2连接异常------回调函数的参数中保存了异常的信息
Mongoose.connection.on('error',function (err){
    console.log('数据库连接异常!!!'+err)
})
//4.3断开连接
Mongoose.connection.on('disconnected',function (){
    console.log('断开数据库的连接!!!')
})

//5.导出Mongoose
module.exports = Mongoose

(3)创建Schema(表示集合的骨架),再由Schema创建Model

a.Schema:定义的是与集合对应的骨架。Schema中的属性对应的是MongoDB中集合的key

b.Model:是Schema的实例,用于操作MongoDB中的集合中的文档

若要指定集合名

关于模型名称和数据库中集合名称的对应关系

(1)数据库中没有集合:

mongoose.model('Book',BookSchema) ===> 在模型名后加s就是集合名(不区分大小写)==>books

mongoose.model('Book',BookSchema,'bookinfo') ===> 第三个参数就是用户定义的集合名

(2)数据库中有集合:

mongoose.model('Book',BookSchema,'数据库中已有的集合名') 

4.mongoose的基本操作

(1)插入文档:save方法

        a.先使用Model创建Entity

        b.再使用Entity调用save方法

const Book = require('../model/bookModel')
//1.通过model创建一个对象
const book = new Book({
    bookId:200101,
    bookName:'MongoDB数据库教程',
    publishing:'机械工业出版社',
    publishTime:'2000-12-30',
    price:45,
    count:10
})

//2.通过对象调用save方法向数据库中插入数据
book.save(function (err,res){//err存放的是保存失败后的错误信息,res是保存的对象
    if (err){
        console.log(err)
    }else {
        console.log(res)
    }
})

(2)删除文档:findByIdAndDelete,直接通过Model调用,作用是根据文档的_id属性删除

3.删除bookId为1012的文档
Book.findByIdAndDelete({
    '_id':"6386d1a48aa8b815dc0007e7",
},function (err,data){
    if (err){//err:数据库错误
        console.log('数据库连接失败'+err)
    }else if (data){//若data不为null:表示删除成功
        console.log('删除成功'+data)
    }else if (!data){//若data为null:表示删除失败
        console.log('删除失败'+data)
    }
})

(3)删除文档:deleteOne,直接通过Model调用,根据给定的条件删除文档

Book.deleteOne({
    'bookId':'1013'
},function (err,data){
    if (err){
        console.log('数据库连接失败'+err)
    }else if (data){
        console.log('删除成功'+data)
    }else if (!data){
        console.log('删除失败'+data)
    }
})

(4)更新文档:findOneAndUpdate,直接通过Model调用

        findOneAndUpdate(条件,更新语句,{},回调函数)

Book.findOneAndUpdate({'bookId':1012},//表示查询条件
    {$set:{'count':15}},//更新语句
    null,//表示查询操作,通常为null
    function (err,data){//更新回调函数:err表示数据库的错误信息,data中存放的findOne查询到的文档
    if (err){//err表示数据库错误
        console.log(err)
    }else if (!data){//data为null时,表示没有找到相应的文档
        console.log('未找到相应的数据'+data)
    }else if (data){//data不为null时,表示找到了相应的文档。 data中保存的是更新前的文档
        console.log('更新成功')
    }
})

(5)updateOne(条件,更新语句,回调函数)

Book.updateOne({'bookId':1014},{$set:{'count':222}},
    function (err,data){
        if (err){//err表示数据库错误
            console.log(err)
        }
        console.log(data.modifiedCount)//data是对象,modifiedCount属性表示被更新的记录数,不为0即更新成功
})

(6)查询所有:find()

//查询所有
Book.find(function (err,data){
    if (err){
        console.log(err)
    }
    console.log(data)
})

(7)按_id查询:findById()

//按_id查询:findById()
Book.findById({
    '_id':'200200000010000000000000'
},function (err,data){
    if (err){
        console.log(err)
    }
    console.log(data)
})

(8)多条件查询:findOne() ===> 返回满足条件的第一条记录

Book.findOne({
    'publishing':'机械工业出版社',
    count:'10'
},function (err,data){
    if (err){
        console.log(err)
    }
    console.log(data)
})

(9)查询集合中的文档数(记录数):count

Book.count(function (err,data){
    if (err){
        console.log(err)
    }
    console.log('记录数'+data)
})

二.在接口中间件中使用Mongoose模块

const express = require('express')
const router = express.Router()

const Book = require('../../db/model/bookModel')

//定义查询所有的接口  http://127.0.0.1:3000/mongoapi/findAll
router.get('/findAll',(req, res)=>{
    Book.find((err,data)=>{
        if (err){
            return console.log(err)
        }
        res.json(data)
    })
})

module.exports = router

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

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

相关文章

使用vite 搭建vue 3的项目

一、目标: 使用vite搭建一个Vue 3 的项目,并启动成功。 二、准备工作 首先你要有Node.js、VSCode编辑器、Chrome浏览器 关于下载的问题Node.js可以去官网下载 链接:http://nodejs.cn/download/ 下载左边的长期支持版本就好,最新版…

基于Haar-Like特征的人脸检测算法研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、Haar-Like 特征✳️ 三、人脸检测实验验证✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 脸是每个人最重要的外貌特征,随着科技推动社会不断向前发展,人脸识别也逐渐融入人们的生活中,例如在…

活动预告丨EMNLP 2022半监督和强化对话系统研讨会12月7日线上召开!

由清华大学和中国移动联合承办的EMNLP 2022 SereTOD Workshop “Towards Semi-Supervised and Reinforced Task-Oriented Dialog Systems(迈向半监督和强化的任务型对话系统)”,即将与EMNLP 2022主会同步举办。因受疫情影响,研讨会…

【蓝桥备战】前缀和+差分+高精度

文章目录前缀和差分大整数加减乘除前缀和 前缀和,即preSum[i] nums[i-1] nums[i-2] nums[0]。一般地,我们会让preSum[0] 0。 图:preSum[3] nums[2] nums[1] nums[0]。 构造前缀和数组对我们来说是简单的,只需要会用以下…

c++中的内存分区模型

内存分区模型 c程序在执行时,将内存大方向划分为4个区域1、代码区:存放函数体的二进制代码,由操作系统进行管理2、全局区:存放全局变量和静态变量以及常量3、栈区:由编译器自动分配释放,存放函数的参数值&…

手把手教你使用Vue3指定状态管理库--Pinia

什么是 Pinia Pinia 与 Vuex 一样,是作为 Vue 的“状态存储库”,用来实现 跨页面/组件 形式的数据状态共享。 在平时的开发过程中,Vue 组件之间可以通过 Props 和 Events 实现组件之间的消息传递,对于跨层级的组件也可以通过 Ev…

Java并发编程实战读书笔记三

第七章 取消和关闭 Java没有提供任何机制来安全的终止线程,虽然 Thread.stop 和 suspend 等方法提供了这样的机制,但由于存在着一些严重的陷,因此应该避免使用 7.1任务取消 7.1.1 中断 取消任务中生产者使用了队列的put操作导致阻塞后任务…

day14_类中成员之构造器

由来 我们发现我们new完对象时,所有成员变量都是默认值,如果我们需要赋别的值,需要挨个为它们再赋值,太麻烦了。我们能不能在new对象时,直接为当前对象的某个或所有成员变量直接赋值呢。可以,Java给我们提…

工作两年,没想到靠Python搞副业让我实现了财务自由

前言 国庆假期和好友聚会,聊了各自近两年的变化,朋友的经历让我大吃一惊! 2年前他还是月薪5千的小编,现在轻松实现月入5万的小目标。 (文末送读者福利) 原来是利用空余时间学会了Python编程&#xff0c…

TPM零知识学习二—— 相关链接和页面

TPM2社区的主页地址为:https://tpm2-software.github.io/ 页面如下: 主页中提供了很多有用的链接,包括: Software | tpm2-software community 页面如下: External | tpm2-software community 页面如下:…

《计算机体系结构量化研究方法》1.8 性能的测量、报告和汇总

引入 1、一些概念 响应时间:手机用户所关注的“速度”,也就是一个事件从启动到完成的时间,又称为执行时间。 吞吐量:给定时间内完成的总工作量,WSC的操作人员关注这个。 执行时间是性能的倒数(即执行时间…

DSP之Controlsuit和C2000Ware下载安装

DSP之Controlsuit和C2000Ware下载安装 Controlsuit 用于 C2000TM 微处理器的 controlSUITETM 是一套全面的软件基础设施和软件工具集,旨在最大程度地缩短软件开发时间。从特定于器件的驱动程序和支持软件到复杂系统应用中的完整系统示例,controlSUITET…

Redis击穿、穿透、雪崩

Redis 的基本概念 在没有添加 Redis 的时候,后端的查询流程是: 用户访问页面-请求后端服务-经过逻辑处理后,去数据库查询信息。 在添加 Redis 的之后,后端的查询流程是: 用户访问页面-请求后端服务-经过逻辑处理后&a…

超强AI绘图-文生图

一、前言 前面汇总了四种AI绘图的方法,详情可以点击下图跳转到文章《AI绘画合集(11月汇总)》。主要内容是:具象意象派AI作图、AI绘制专属动漫头像、基于ViLG模型AI 作画。点击下面文章跳转! 《AI绘图—对中文拟合度…

LabVIEW创建类 3

LabVIEW创建类 3 继承 通过“继承”可在现有类的基础上创建新类。若创建一个新的LabVIEW类并将它设置为继承另一个类的数据及成员VI,这个新类将可使用它所继承的类中“公共”及“保护”型的成员VI。这个新类还可添加自己的数据和成员VI以丰富其功能。例如&#xf…

聚观早报 | 脸书泄露数据被罚20亿;iPhone15将全系支持灵动岛

今日要闻:脸书泄露数据被罚20亿;iPhone15将全系支持灵动岛;540万推特用户数据被盗;罗永浩入局tiktok;特斯拉研发改款Model3脸书泄露数据被罚20亿 据报道,脸书因泄露5亿用户数据,被欧洲监管机构罚…

Starday为什么是跨境电商卖家的不二之选?

据国内海关统计显示,近5年来,中国跨境电商规模增长近10倍,年增长率在30%以上,占国际贸易近40%。基于流量模式的跨境电商直播、垂直跨境电商等新模式蓬勃发展,近几年跨境电商一直不断地在深度融合发展,加之疫…

WSL Ubuntu20.04安装pycairo指南

环境说明 wsl Ubuntu20.04 走过的一些可能有用的弯路 由于pycairo要求python3.7,但是之前Ubuntu上有个3.6的python环境,所以就安装了python3.8: sudo apt install python3.8然后python3命令还是链接到python3.6,结果就yongln …

Stateflow状态转移练习

文章目录1.外部转移与内部转移1.1 stateflow1.2 分析2.外部转移内部转移超转移2.1 stateflow2.2 video1.外部转移与内部转移 1.1 stateflow 1.2 分析 首先是 xyz0,然后进入 A 状态,此时 A 的 en 激活,xx1,即 x1其次进入默认状态…

聊天软件im即时通讯源码酷信视酷,在线语音视屏通话端对端加密聊天,支持7端互通带部署教程

APP端有安卓端苹果端,PC端,web端,管理端有PC后台! .产品为独立开发,非网上下载不能用的产品! .高端产品,即时聊天软件技术难度大,请不要拿网络其他聊天软件来对比&#xff0…