• 使用Express框架操作MongoDB数据库


    目录

    前言

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

    1.Mongoose模块

    2. Mongoose模块的使用

    ​ (1)安装:npm install mongoose

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

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

       (4) dao层的定义

    (5)service服务层的定义

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


    前言

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

    1. /*--------------------与数据库连接config(配置)文件-----------------------------*/
    2. const Mongoose = require('mongoose');
    3. //定义Mongodb数据库的连接字符串
    4. const mdb_url = 'mongodb://127.0.0.1:27017/mytest';
    5. /*3. 建立和MongoDB数据库的连接
    6. useNewUrlParser: 是否使用新的url转换方式,
    7. useUnifiedTopology: 是否使用新的用户安全策略
    8. */
    9. Mongoose.connect(mdb_url,{useNewUrlParser:true,useUnifiedTopology:true});
    10. //建立连接--连接成功触发connected事件
    11. Mongoose.connection.on('connected',()=>{
    12. console.log('数据库连接成功! 连接地址为:',mdb_url);
    13. });
    14. //连接异常-- 回调函数的参数中保存了异常的信息
    15. Mongoose.connection.on('err',(err)=>{
    16. console.log('数据库连接异常!',err);
    17. });
    18. //断开连接
    19. Mongoose.connection.on('disconnected',()=>{
    20. console.log('断开数据库的连接!');
    21. });
    22. //导出Mongoose,供dao层创建映射模型使用
    23. 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层的定义

    1. //------------------------CURD封装文件----------------------
    2. //-----------------------dao层: 专门操作数据库的增删改查-------------
    3. //导入模型
    4. const Blog = require('../../model/blogModel');
    5. //-------------封装CURD-------------------------
    6. //-------------通过数据库映射模型,调用增删改查的方法-------------------------
    7. const blogCrud = {
    8. //增加博客数据
    9. insertBlog: async (admin)=>{
    10. //创建实例
    11. const blog = new Blog({
    12. blogId:admin.c_id,
    13. type: admin.c_type,
    14. title: admin.c_title,
    15. content:admin.c_content,
    16. author:admin.c_author,
    17. creatAt:admin.c_time
    18. });
    19. return await blog.save();
    20. },
    21. //删除Blog
    22. removeBlog: async (del_id)=>{//通过id进行删除
    23. const result = await Blog.findOneAndRemove({blogId:del_id});
    24. return result;
    25. },
    26. //更新Blog
    27. updateBlog: async (temp)=>{
    28. const result = await Blog.findOneAndUpdate({blogId:temp.c_id},
    29. {$set:{
    30. type: temp.c_type,
    31. title: temp.c_title,
    32. content:temp.c_content,
    33. } });
    34. return result;
    35. },
    36. //查询所有Blog
    37. findAllBlog: async ()=>{
    38. const result = await Blog.find();
    39. return result;
    40. },
    41. //id自增的方法
    42. countAdd: async ()=>{
    43. const result = await Blog.count();
    44. return result;
    45. }
    46. }
    47. //将封装的blogCrud导出供服务层使用
    48. module.exports = blogCrud;

    (5)service服务层的定义

    1. //---------------服务层接收(响应)前后端的数据
    2. //导入dao层封装的crud对象导入
    3. const blogCrud = require('../dao/crud/blogOption');
    4. //增加blog的回调
    5. exports.addBlog = async (req,res)=>{
    6. let count = 0;
    7. try {
    8. count = await blogCrud.findAllBlog().then((result)=>{
    9. if(result) return result[result.length-1].blogId;
    10. });
    11. }catch (e){
    12. console.log(e);
    13. }
    14. let admin = {
    15. c_id: count + 1,//保证id自增1
    16. c_type:req.body.cType,
    17. c_title:req.body.cTitle,
    18. c_content:req.body.cContent,
    19. c_author: '前端攻城狮',
    20. c_time: new Date(),
    21. }
    22. blogCrud.insertBlog(admin).then((data)=>{
    23. if(data){
    24. res.json({
    25. code:2000,
    26. msg:'添加成功'
    27. })
    28. }
    29. }).catch((e)=>{
    30. console.log('增加失败',e);
    31. });
    32. };
    33. //删除blog的回调
    34. exports.delBlog = (req,res)=>{
    35. let del_id = req.body.del_id;
    36. blogCrud.removeBlog(del_id).then((data)=>{
    37. if(data){
    38. res.json({
    39. code:2000,
    40. msg:'删除成功'
    41. })
    42. }
    43. }).catch((e)=>{
    44. console.log('删除失败',e);
    45. })
    46. };
    47. //更新回调
    48. exports.update_Blog = (req,res)=>{
    49. let temp = {
    50. c_id: req.body.cId,
    51. c_type:req.body.cType,
    52. c_title:req.body.cTitle,
    53. c_content:req.body.cContent,
    54. }
    55. blogCrud.updateBlog(temp).then((data)=>{
    56. if(data){
    57. res.json({
    58. code:2000,
    59. msg:'更新成功'
    60. })
    61. }
    62. }).catch((err)=>{
    63. console.log(err);
    64. })
    65. };
    66. //查询所有
    67. exports.queryAll = (req,res)=>{
    68. blogCrud.findAllBlog().then((data)=>{
    69. if(data){
    70. res.json(data);
    71. }
    72. }).catch((err)=>{
    73. console.log(err);
    74. })
    75. };
    76. //

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

    1. //-------------------------路由中间件--------------------------
    2. //导入创建路由的模块
    3. const express = require('express');
    4. const router = express.Router();
    5. //导入服务层的api回调
    6. const blogServices = require('../../dbmongodb/services/blogServices');
    7. //增加接口,http://localhost:3000/blog/addBlog
    8. router.post('/addBlog',blogServices.addBlog);
    9. //删除接口,http://localhost:3000/blog/delBlog
    10. router.delete('/delBlog',blogServices.delBlog);
    11. //更新接口,http://localhost:3000/blog/updateBlog
    12. router.post('/updateBlog',blogServices.update_Blog);
    13. //查询所有接口,http://localhost:3000/blog/findAllBlog
    14. router.get('/findAllBlog',blogServices.queryAll)
    15. //导出路由器
    16. module.exports = router;
  • 相关阅读:
    pandas使用del函数删除dataframe数据中的第一个数据列(筛选dataframe的第一个数据列并使用del将其删除)
    ViewPager和ViewPager2
    《Spring 5.x源码解析之Spring AOP 注解驱动使用及其实现原理》
    详解IDEA git 版本回滚
    Unity的相机跟随和第三人称视角二
    【附源码】计算机毕业设计java员工工资管理系统设计与实现
    项目启动 | 盘古信息助力鼎阳科技开启智能制造升级新征程
    Springboot初步开发网站(不接数据库,简单增删改查实现)
    Git常用指令以及常见问题解决
    Linux基本命令,基础知识
  • 原文地址:https://blog.csdn.net/weixin_46672437/article/details/128177977