Express操作MongoDB

news2024/11/24 20:58:09

一、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,//表示查询操作,通常为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('更新成功:'+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.coloradmin.cn/o/48814.html

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

相关文章

数字逻辑·时序线路设计【原始状态表】

这一篇着重原始状态表 组合线路设计与时序线路设计的区别 组合线路设计方法: 确定输入和输出写真值表写表达式并化简根据题目给出的门或者其他要求进行变换(取反)画电路图 时序线路设计方法: 确定输入和输出,建立…

[Linux]------初识多线程

文章目录前言一、 Linux线程概念什么是线程线程理解证明C线程库二、页表三、线程的优点四、线程缺点五、线程异常六、线程的用途总结前言 本节重点!!! 了解线程概念,理解线程与进程的区别和联系。学会线程控制,线程创…

因子模型套利定价理论APT的应用

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 一、APT(套利定价理论)应用于计算投资组合的风险 某个投资组合由两个股票A和B组成,它们的暴露系数向量(exposure vector)分别为和。两个股票在投资组合中的比重为…

Turtlebot2简单控制

遥控 遥控前为了让turtlebot接受命令,需要启动 roslaunch turtlebot_bringup minimal.lauch 键盘操作命令: roslaunch turtlebot_teleop keyboard_teleop.launch 简单脚本控制: 首先输入命令 roslaunch turtlebot_bringup minimal.lau…

WebRTC学习笔记七 pion/webrtc

一、Usage用法 1.使用Go Modules Go Modules are mandatory for using Pion WebRTC. So make sure you set export GO111MODULEon, and explicitly specify /v2 or /v3 when importing. 2.常见示例 example applications contains code samples of common things people bu…

Web3.0带来天翻地覆的变化?全面科普!所谓的Web3.0到底是什么?

Web3.0在2021年尾声突然蹿红,在美国国会的听证会里,一句“我们如何确保web3革命发生在美国”引发了大家对于Web3.0的关注,而后马斯克一篇内容为“有人看过web3.0吗? 我没有找到”的推文,将关于Web3.0的讨论推向了高潮。 甚至于这…

零基础入门JavaWeb——CSS相关知识

一、CSS的作用 SS是用于设置HTML页面标签的样式&#xff0c;用于美化HTML页面。 二、CSS的引入方式 2.1 行内样式 在要设置样式的标签中添加style属性&#xff0c;编写css样式&#xff1b;行内样式仅对当前标签生效。 <div style"border: 1px solid red;width: 10…

「MySQL高级篇」SQL优化

大家好&#xff0c;我是Zhan&#xff0c;一名个人练习时长一年半的大二后台练习生&#xff0c;最近在学MySQL高级篇&#xff0c;欢迎各路大佬一起交流讨论 &#x1f449;本篇速览 在前面对索引的的学习中&#xff0c;我们学习到了从MySQL“底层”优化了SQL执行查询的算法&…

认识微服务

认识微服务&#xff1a; 背景&#xff1a;随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。 这些架构之间有怎样的差别呢&#xff1f; 单体架构&#xff1a; 单体架构&#xff1a;将业务的所有功…

颜色的感知

人体内有三种颜色感知细胞&#xff0c;能感知红、绿、蓝三种颜色。 人体内还有一种光强感知细胞&#xff0c;这种关光的波长刚好和绿光接近。 椎状感应颜色 柱状感应强度。

[附源码]Python计算机毕业设计Django的专业技能认证系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

RocketMQ 的消费者类型详解与最佳实践

作者&#xff1a;凌楚 在 RocketMQ 5.0 中&#xff0c;更加强调了客户端类型的概念&#xff0c;尤其是消费者类型。为了满足多样的 RocketMQ 中一共有三种不同的消费者类型&#xff0c;分别是 PushConsumer、SimpleConsumer 和 PullConsumer。不同的消费者类型对应着不同的业务…

AI美颜SDK算法详解

AI美颜SDK是近几年兴起的新兴美颜方式&#xff0c;区别于传统的美颜工具&#xff0c;AI美颜采用人工智能的深度学习算法实现智能化美颜&#xff0c;下文小编将为大家讲解一下AI美颜SDK相关的知识。 一、与传统美颜的区别之处 从宏观角度来讲&#xff0c;AI美颜技术与传统美颜…

高维多元时序数据聚类

1. 简介 收集数据的能力不断增强&#xff0c;使我们有可能收集大量的异构数据。在可用的异构数据中&#xff0c;时间序列代表着尚未被充分探索的信息母体。当前的数据挖掘技术在分析时间序列时存在多个缺点&#xff0c;尤其是在应同时分析多个时间序列&#xff08;即多维时间序…

C# Winform控件库分享,免费开源,支持中文!(附DLL及教程)

这款控件包是基于MaterialSkin2二次开发的&#xff0c;可以更换想要的皮肤主题&#xff0c;一键转换暗色系&#xff0c;还拥有非常炫酷的动画&#xff0c;非常好看&#xff0c;原本的MaterialSkin2是国外团队开发的&#xff0c;不支持中文&#xff0c;所以我在里面加了几款中文…

springboot学生宿舍报修换宿管理系统-宿管

宿舍管理系统设计与实现由管理员和学生、宿管交互构成。学生对于本系统的使用&#xff0c;学生可以通过系统注册、登录&#xff0c;修改个人信息&#xff0c;查看学生宿舍、消息通知、换宿申请等功能。 宿管对于本系统的使用&#xff0c;宿管可以通过系统登录&#xff0c;修改个…

RabbitMQ如何确保消息发送 ? 消息接收?

发送方确认机制&#xff1a; 信道需要设置为 confirm 模式&#xff0c;则所有在信道上发布的消息都会分配⼀个唯⼀ ID。⼀旦消息被投递到queue&#xff08;可持久化的消息需要写⼊磁盘&#xff09;&#xff0c;信道会发送⼀个确认给⽣产者&#xff08;包含消息唯⼀ ID&#xff…

Codeforces Round #719 (Div. 3) E. Arranging The Sheep

翻译&#xff1a; 你正在玩“安排羊”游戏。这个游戏的目标是让羊排好队。游戏中的关卡是由长度为&#x1d45b;的字符串描述的&#xff0c;由角色的’组成。(空格)和*(绵羊)。在一个动作中&#xff0c;你可以移动任何羊向左或向右移动一个方格&#xff0c;如果相应的方格存在…

Paper写作怎么按照要求来具体分析?

许多留学生通常面临写学术Paper的问题&#xff0c;而大多数都不知道Paper如何写&#xff0c;因为写Paper并不是容易的事情。学术Paper应按照严格要求和规则撰写&#xff0c;而其应提供扎实&#xff0c;有争议的论点&#xff0c;然后由相关的无论是来自其他来源还是自己研究的证…

流媒体直播播放协议:HLS、RTMP、HTTP-FLV

流媒体直播播放协议&#xff1a;HLS、RTMP、HTTP-FLV一、推拉流二、协议介绍1. HLS2. RTMP3. HDL (HTTP-FLV)一、推拉流 在开始之前&#xff0c;先把流媒体服务中的双端关系说一下&#xff1a;在一个完整的流媒体服务框架中&#xff0c;角色就是“两端加一服”。推流端、拉流端…