使用Express框架操作MongoDB数据库

news2024/11/17 6:02:40

前言

1、NoSQL数据库:非关系型数据库。数据的组织形式不是二维表格。即Not Only SQL,不能使用SQL语句操作数据。适合存储超大

规模、数据长度不确定的数据,数据没有规定的格式,不需要进行任何的设置就可以自由的横向扩展

2、什么是MongoDB:是用C++编写的,用于分布式系统的数据存储。存储数据的格式是 key : value

​ 数据库:database

​ 数据表(table) <—— > collection(集合)

​ 行(row) <———> document(文档)

3、MongoDB的数据类型:

​ ObjectId:类似唯一主键,长度为12个字节,通常用于生成文档的_id值

强调:在MongoDB中,每个文档都有一个 _id属性,若用户在创建文档时没有给出 _id ,MongDB会用ObjectId来为 _id生成一个,

_id的值是唯一的,用来唯一标识一个文档(一条记录)

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

1.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对应的实体

2. Mongoose模块的使用

​ (1)安装:npm install mongoose

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

/*--------------------与数据库连接config(配置)文件-----------------------------*/
const Mongoose = require('mongoose');

//定义Mongodb数据库的连接字符串
const mdb_url = 'mongodb://127.0.0.1:27017/mytest';

/*3. 建立和MongoDB数据库的连接
    useNewUrlParser: 是否使用新的url转换方式,
    useUnifiedTopology: 是否使用新的用户安全策略
*/
Mongoose.connect(mdb_url,{useNewUrlParser:true,useUnifiedTopology:true});

//建立连接--连接成功触发connected事件
Mongoose.connection.on('connected',()=>{
    console.log('数据库连接成功! 连接地址为:',mdb_url);
});
//连接异常-- 回调函数的参数中保存了异常的信息
Mongoose.connection.on('err',(err)=>{
    console.log('数据库连接异常!',err);
});

//断开连接
Mongoose.connection.on('disconnected',()=>{
    console.log('断开数据库的连接!');
});

//导出Mongoose,供dao层创建映射模型使用
module.exports = Mongoose;

(3)创建Schema,再由Schema创建Model

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

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

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

a.  数据库中没有集合:

​ mongoose.model(‘Blog’,BlogSchema) ==> 在模型名后加s就是集合名(不区分大小写) ==> blogs

​ mongoose.model(‘Blog’,BlogSchema,’blog’) ==> 第三个参数就是用户定义的集合名

b.  数据库中有集合:

​ mongoose.model(‘Blog’,BlogSchema,’数据库中已有的集合名’)

(4) dao层的定义

//------------------------CURD封装文件----------------------
//-----------------------dao层: 专门操作数据库的增删改查-------------

//导入模型
const Blog = require('../../model/blogModel');

//-------------封装CURD-------------------------
//-------------通过数据库映射模型,调用增删改查的方法-------------------------
const blogCrud = {
    //增加博客数据
    insertBlog: async (admin)=>{
        //创建实例
        const blog = new Blog({
            blogId:admin.c_id,
            type: admin.c_type,
            title: admin.c_title,
            content:admin.c_content,
            author:admin.c_author,
            creatAt:admin.c_time
        });
        return await blog.save();
    },

    //删除Blog
    removeBlog: async (del_id)=>{//通过id进行删除
        const result = await Blog.findOneAndRemove({blogId:del_id});

        return result;
    },
    //更新Blog
    updateBlog: async (temp)=>{
        const result = await Blog.findOneAndUpdate({blogId:temp.c_id},
            {$set:{
                    type: temp.c_type,
                    title: temp.c_title,
                    content:temp.c_content,
                }   });

        return result;
    },

    //查询所有Blog
    findAllBlog: async ()=>{
        const result = await Blog.find();
        return result;
    },

    //id自增的方法
    countAdd: async ()=>{
        const result = await Blog.count();
        return result;
    }
}

//将封装的blogCrud导出供服务层使用
module.exports = blogCrud;

(5)service服务层的定义

//---------------服务层接收(响应)前后端的数据

//导入dao层封装的crud对象导入
const blogCrud = require('../dao/crud/blogOption');

//增加blog的回调
exports.addBlog = async (req,res)=>{
    let count = 0;
    try {
        count = await blogCrud.findAllBlog().then((result)=>{
            if(result) return result[result.length-1].blogId;
        });
    }catch (e){
        console.log(e);
    }

    let admin = {
        c_id: count + 1,//保证id自增1
        c_type:req.body.cType,
        c_title:req.body.cTitle,
        c_content:req.body.cContent,
        c_author: '前端攻城狮',
        c_time: new Date(),
    }
    blogCrud.insertBlog(admin).then((data)=>{
        if(data){
            res.json({
                code:2000,
                msg:'添加成功'
            })
        }
    }).catch((e)=>{
        console.log('增加失败',e);
    });


};

//删除blog的回调
exports.delBlog = (req,res)=>{
    let del_id = req.body.del_id;
    blogCrud.removeBlog(del_id).then((data)=>{
        if(data){
            res.json({
                code:2000,
                msg:'删除成功'
            })
        }
    }).catch((e)=>{
        console.log('删除失败',e);
    })
};

//更新回调
exports.update_Blog = (req,res)=>{
    let temp = {
        c_id: req.body.cId,
        c_type:req.body.cType,
        c_title:req.body.cTitle,
        c_content:req.body.cContent,
    }
    blogCrud.updateBlog(temp).then((data)=>{
        if(data){
            res.json({
                code:2000,
                msg:'更新成功'
            })
        }
    }).catch((err)=>{
        console.log(err);
    })


};

//查询所有
exports.queryAll = (req,res)=>{
    blogCrud.findAllBlog().then((data)=>{
        if(data){
            res.json(data);
        }
    }).catch((err)=>{
        console.log(err);
    })
};

//

(5)路由接口文件的创建

//-------------------------路由中间件--------------------------
//导入创建路由的模块
const express = require('express');
const router = express.Router();

//导入服务层的api回调
const blogServices = require('../../dbmongodb/services/blogServices');

//增加接口,http://localhost:3000/blog/addBlog
router.post('/addBlog',blogServices.addBlog);

//删除接口,http://localhost:3000/blog/delBlog
router.delete('/delBlog',blogServices.delBlog);

//更新接口,http://localhost:3000/blog/updateBlog
router.post('/updateBlog',blogServices.update_Blog);

//查询所有接口,http://localhost:3000/blog/findAllBlog
router.get('/findAllBlog',blogServices.queryAll)

//导出路由器
module.exports = router;

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

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

相关文章

[附源码]计算机毕业设计校园服装租赁系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

G1D30-NLP(Tokenizer)DP(交叠子问题)

一、NLP &#xff08;一&#xff09;bert中一些标记 1、[SEP] 用于断句&#xff0c;其真实效果&#xff0c;有待考究&#xff0c;因为有segment embedding 2、[CLS] 生成一个向量&#xff0c;用来进行文本分类 &#xff08;二&#xff09;AutoTokenizer 关于tokenizer更…

JMeter入门教程(16)——非GUI运行

文章目录1.任务背景2.任务目标3.任务实操1.任务背景 JMeter的场景运行方式分为两种&#xff0c;一种是GUI&#xff08;视窗运行&#xff0c;即我们可以看到的运行界面&#xff09;方式&#xff0c;另一种是非GUI&#xff08;命令窗口&#xff09;方式运行&#xff0c;在Window…

HTML网页大作业代码【免费代码已上传】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]计算机毕业设计校园便携系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于springboot的智慧养老平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;html、Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

SpringBoot+Vue项目便捷洗衣服务平台

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

线程间实现通信的几种方式

目录线程通信相关概述提出问题方式一&#xff1a;使用Object类的wait() 和 notify() 方法方式二&#xff1a;Lock 接口中的 newContition() 方法返回 Condition 对象&#xff0c;Condition 类也可以实现等待/通知模式方法三&#xff1a;使用 volatile 关键字方法四&#xff1a;…

微服务系列之微服务架构

引言 他发现了人类行为的一大法则&#xff0c;那就是&#xff0c;为了要使一个大人或小孩极想干某样事情&#xff0c;只需要设法把那件事情弄得不易到手就行了----《汤姆索亚历险记》 参考书籍&#xff1a; “凤凰架构”“微服务架构设计模式” 在了解微服务架构之前&#…

WorkTool企微机器人APP分享自定义链接

移动端应用怎么分享自定义网页链接到企业微信 前言 我们知道分享自定义网页可以采用转发形式发到企业微信的客户或群里&#xff0c;但是如果我们业务需要配置每次链接入口不同&#xff0c;如链接附带一些业务参数&#xff0c;这时单纯使用转发常常不能满足需求。找到一种替代…

脉冲触发的触发器

唯一的不同在于时钟信号的控制不一样 前面的叫做主触发器&#xff0c;后面叫做从触发器 为什么在一个时钟周期内只可能改变一次&#xff1f;&#xff08;工作原理&#xff09; 在时钟信号等于0期间&#xff0c;看看时钟信号的工作 CLK1期间&#xff0c;主FF工作&#xff0c;…

JeecgBoot搭建(低代码)

环境安装 后端&#xff1a;JDK: 1.8 (小于11)、Maven: 3.5、MySql: 5.7、Redis: 3.2 前端&#xff1a;Node Js: 14.18 / 16、Npm: 5.6.0、Yarn: 1.21.1 、Pnpm 工具&#xff1a; IDEA、Navicat、Git、TortoiseGit拉取代码 后端&#xff1a;git clone https://gitee.com/jeecg/…

[附源码]计算机毕业设计网上电影购票系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

升级Seata Server 1.5.2

目录引言下载地址配置初始Mysql数据库支持TCC Fence引言 最近在做Seata TCC集成&#xff0c;集成过程中将Seata Server由原来的1.4.2升级为最新的1.5.2&#xff0c;本文记录了Seata 1.5的升级过程。 原Seata 1.4.2的安装过程可参见我之前的博客&#xff1a; 分布式事务 - Seat…

TPU编程竞赛系列|基于TPU平台的人车目标检测初赛收官!

近日&#xff0c;AI算法创新赛-“基于TPU平台的人车目标检测”初赛正式结束&#xff0c;经过激烈地角逐&#xff0c;最终排名TOP20的队伍成功进入复赛&#xff0c;开启新的赛程&#xff01; 目标检测是计算机视觉的热门方向&#xff0c;广泛应用于各种智能视频监控系统中。人、…

Flink系列之Flink中State设计详解与企业案例实践

title: Flink系列 二、Flink State 设计详解 Flink 官网解释&#xff1a;Apache Flink — Stateful Computations over Data Streams 前课中 WordCount 的例子&#xff0c;可以得知&#xff1a;其实我们会发现&#xff0c;单词出现的次数有累计的效果。如果没有状态的管理&am…

自制肥鲨HDO2电源升压延长线

自制肥鲨HDO2电源升压延长线1. 问题源由2. 解决方案3. 材料准备4. 最终延长线产出4.1 裸照4.2 成品5. 参考资料1. 问题源由 之前我们介绍了【自制肥鲨HDO2电源降压延长线&#xff0c;支持3S~6S动力电池】&#xff0c;主要解决使用动力电池给眼镜供电的问题。 但是马上有兄弟反…

SpringMVC执行流程

SpringMVC的流程 整个过程开始于客户端发出的一个HTTP请求&#xff0c;Web应用服务器接收到这个请求。如果匹配DispatcherServlet的请求映射路径&#xff0c;则Web容器将该请求转交给DispatcherServlet处理。DispatcherServlet接收到这个请求后&#xff0c;将根据请求的信息&a…

Linux环境下Vivado和HLS功能测试

一. 简介 针对已经完成的Vivado在Linux下的安装与运行&#xff0c;本文主要通过一个LED灯闪烁的案例对Vivado和HLS在Linux操作系统下的运行流程进行介绍&#xff0c;并对已安装软件功能进行一个简单的测试。 HLS将C代码的编译综合为Verilog或VHDL代码&#xff0c;本文对HLS生成…

[附源码]计算机毕业设计JAVA医院门诊信息管理系统

[附源码]计算机毕业设计JAVA医院门诊信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…