Express操作MongoDB

news/2024/4/18 20:42:01/文章来源:https://blog.csdn.net/m0_74331185/article/details/128120659

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

1、MongoDB数据库:

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

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

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

2、Mongoose模块

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

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)创建数据库连接文件:

const Mongoose = require('mongoose')
// 2.定义MongoDB数据库的连接字符串:协议://主机地址:端口号/数据库名
const mdb_url = 'mongodb://127.0.0.1:27017/mvc'
/*  3.建立和MongoDB数据库的连接:useNewUrlParser:是否使用新的url地址转换方式useUnifiedTopology:是否使用新的用户安全策略
*/
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('disconnectied',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: ‘2005-10-27’,
price: 56,
count: 10
})
// 2.通过对象调用save方法向数据库中插入数据
//err是保存失败后的错误信息,res是保存的对象
book.save(function (err,res) {
if (err){
console.log(err)
}else{
console.log(res)
}
})

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

Book.findByIdAndDelete({
‘_id’:’63554959be8cddf0ba26241d’
},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调用,根据给定的条件删除文档

//删除bookid为1012的文档
Book.deleteOne({'bookId':1012
},function (err,data) {if (err){console.log(err)}else if(data){console.log('删除成功:'+data)}
})

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

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

Book.findOneAndUpdate({ 'bookId':1001},  //表示查询的条件{$set:{'count':15}}, //更新语句null,//表示查询操作,通常为nullfunction (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('更新成功:'+data)}
})

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

Book.updateOne({'bookId':1001},{$set:{'count':100}},function (err,data){if (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

Book.findById({'_id':'2002000000c0000000000000'
},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://localhost:8089/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.luyixian.cn/news_show_39284.aspx

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

相关文章

用字典统计序列中键和值的数量collections.Counter()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 用字典统计序列中键和值的数量 collections.Counter() 选择题 以下python代码结果错误的一项是? from collections import Counter myList[a,b,a] print(【显示】myList,myList) myDictCoun…

mapreduce搭建

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 mapreduce搭建一、配置1.创建mapred-site.xml文件2.编辑mapred-site.xml二、打开hadoop0.删除da…

小学生学Arduino---------点阵(一)静态图片显示

今天来看一下,点阵模块这一模块可以做出非常有意思的东西。 学习目标: 1、了解点阵原理 2、掌握图形绘制(心形、三角形等) 3、掌握图形显示器的功能 4、掌握led点阵屏幕的功能 5、搭建电路 6、编写程序 一、点阵的原理 LED点阵屏…

Leu-Trp-Leu-COOH,42293-99-2

编号: 122381中文名称: 三肽Leu-Trp-Leu英文名: Leu-Trp-LeuCAS号: 42293-99-2单字母: H2N-LWL-OH三字母: H2N-Leu-Trp-Leu-COOH氨基酸个数: 3分子式: C23H34N4O4平均分子量: 430.54精确分子量: 430.26等电点(PI): 6.11pH7.0时的净电荷数: -0.02平均亲水性: -2.3333333333333疏…

Qt QCustomPlot 点状网格线实现和曲线坐标点拾取

Qt QCustomPlot 点状网格线实现和曲线坐标点拾取 文章目录Qt QCustomPlot 点状网格线实现和曲线坐标点拾取摘要我想实现的效果点阵的实现第一版本,使用QPen Style第二版本,通过设置背景第三版本,回到QPen Style取曲线上的点关键字&#xff1a…

VS Code + Vue 开发环境搭建

1、下载并安装 Visual Studio Code 2019 2、Visual Studio Code 2019安装成功后,打开VS Code 工具点击左侧【扩展】菜单,在搜索栏中输入 Chinese 查找中文语言汉化包插件下载安装,然后重启VS Code 3、点击左侧【扩展】菜单,在搜…

WebDAV之葫芦儿·派盘+静读天下

静读天下 支持webdav方式连接葫芦儿派盘。 如今,很多人都喜欢在手机上进行阅读,所以想要获得更好的阅读体验,一款实用的电子书就显得尤为重要了,因此,静读天下这款纯正的本地电子书阅读软件您值得拥有,而且还支持本地电子书备份到葫芦儿派盘。 静读天下是一款备受千万…

【问题思考总结】NAT的公有地址怎么转换为私有地址?【MAC地址和IP地址的转换】

问题起源 在做一道题的时候,涉及到了由内网到外网再到内网时的IP地址转换。在外网的时候,答案说的是不能够用私有IP地址作为源IP地址,然后疑问产生了:如果不能用私有IP地址作为目的地址,他又怎么能够找到那个主机呢&a…

在 Node.js 中操作 Redis

在 Node.js 中操作 Redis Node.js 中可以操作 Redis 的软件包推荐列表:https://redis.io/clients#nodejs。 推荐下面两个: node-redisioredis 这里主要以 ioredis 为例。 ioredis 是功能强大的 Redis 客户端,已被世界上最大的在线商务公司…

MySQL日志管理、备份与恢复

文章目录一、mysql常用日志1、概述①、错误日志②、二进制日志③、中继日志④、慢查询日志⑤、通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的2、数据库中查询日志状态①、查看二进制日志开启状态②、查看慢查询日志功能是否开启③、查看慢查…

GAN生成漫画脸

最近对对抗生成网络GAN比较感兴趣,相关知识点文章还在编辑中,以下这个是一个练手的小项目~ (在原模型上做了,为了减少计算量让其好训练一些。) 一、导入工具包 import tensorflow as tf from tensorflow.keras import layersimport numpy a…

业务:财务会计业务知识

一、引言 会计是以货币为主要计量单位,对企业、事业、机关、团体及其他经济组织的经济活动进行记录、计算、控制、分析、报告,以提供财务和管理信息的工作。会计的职能主要是反映和控制经济活动过程,保证会计信息的合法、真实、准确和完整&a…

校园论坛网站设计设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

网页JS自动化脚本(四)修改元素的尺寸颜色显隐状态

修改元素尺寸 在定位到了元素之后, 我们就可以对元素进行一些修改了,我们先来修改元素泊宽度以及高度 window.onloadfunction(){var theElementdocument.querySelector("img.undertips-link-lefticon");theElement.style.width"100px";theElement.style.…

命令模式

文章目录思考命令模式1.命令模式的本质2.何时选用命令模式3.优缺点4.实现耦合写法命令模式优化耦合写法命令模式实现撤销命令模式实现厨师做菜命令模式实现排队命令模式实现日志持久化思考命令模式 命令模式就是解耦强耦合代码,用户只关心功能的实现,开发…

win11该文件没有与之关联的应用怎么办

win11用户在使用电脑的时候遇到了“该文件没有与之关联的应用”的提示,这是怎么回事呢?应该怎么办呢?出现这个情况应该是注册表被误删了,大家需要新建一个文本文档,然后输入下文提供的指令,之后将其重命名为…

linux不显示当前路径的解决方法

1.输入vim ~/.bashrc进入用户的shell环境变量的配置文件(可以设置环境变量以及通过alias设置别名) 2.按下“i”键进入编辑模式(底部显示INSERT) 3.修改\w为$PWD: 修改为: 4.按“esc”键后输入":wq"保存并退出&#xff…

Databend 开源周报 #69

Databend 是一款强大的云数仓。专为弹性和高效设计,自由且开源。 即刻体验云服务:https://app.databend.com。 New Features multiple catalog 实现删除用户定义目录 (#8820) meta 新增用于删除 key 和使 key 过期的 cli 命令 (#8858) planner 支…

手把手教你做智能合约开源|多文件合约开源|引用文件开源

本文手把手教你使用 区块链浏览器 验证智能合约的三种方式。 验证单一 Solidity 文件 在开始验证之前,我们需要首先部署智能合约。进入 Remix IDE,创建一个合约新文件。复制粘贴下面的代码: // SPDX-License-Identifier: MITpragma solidit…

JAVA学习-java基础讲义02

java基础讲义02一 进制1.1 进制介绍1.2 二进制1.3 任意进制到十进制转换1.4 十进制到任意进制之间的转换1.5 快速转换法1.6 有符号数据表示法二 Java变量和数据类型1.1 变量概述1.2 数据类型1.3 变量定义三 Java数据类型转换3.1 数据类型转换概述3.2 数据类型转换之自动类型转换…