• Express操作MongoDB


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

    1. const Mongoose = require('mongoose')
    2. // 2.定义MongoDB数据库的连接字符串:协议://主机地址:端口号/数据库名
    3. const mdb_url = 'mongodb://127.0.0.1:27017/mvc'
    4. /* 3.建立和MongoDB数据库的连接:
    5. useNewUrlParser:是否使用新的url地址转换方式
    6. useUnifiedTopology:是否使用新的用户安全策略
    7. */
    8. Mongoose.connect(mdb_url,{useNewUrlParser:true,useUnifiedTopology:true})
    9. // 4.对连接过程进行处理
    10. //4.1 : 建立连接---连接成功触发connected事件
    11. Mongoose.connection.on('connected',function (){
    12. console.log('数据库连接成功!连接地址是:'+mdb_url)
    13. })
    14. // 4.2 : 连接异常 --- 回调函数的参数中保存了异常的信息
    15. Mongoose.connection.on('error',function (err){
    16. console.log('数据库连接异常!'+err)
    17. })
    18. // 4.3 : 断开连接
    19. Mongoose.connection.on('disconnectied',function (){
    20. console.log('断开数据库的连接!')
    21. })
    22. // 5. 导出Mongoose
    23. 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方法

    1. const Book = require(‘../model/bookModel’)
    2. // 1.通过model创建一个对象
    3. const book = new Book({
    4. bookId:200101,
    5. bookName: ‘MongoDB数据库教程’,
    6. publishing: ‘机械工业出版社’,
    7. publishTime: ‘2005-10-27’,
    8. price: 56,
    9. count: 10
    10. })
    11. // 2.通过对象调用save方法向数据库中插入数据
    12. //err是保存失败后的错误信息,res是保存的对象
    13. book.save(function (err,res) {
    14. if (err){
    15. console.log(err)
    16. }else{
    17. console.log(res)
    18. }
    19. })

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

    1. Book.findByIdAndDelete({
    2. ‘_id’:’63554959be8cddf0ba26241d’
    3. },function(err,data){
    4. if (err){ //err:数据库错误,例如删除时数据库连接超时
    5. console.log(err)
    6. }else if(data){ //若data不为null:表示删除成功
    7. console.log(‘删除成功:’+data)
    8. }else if(!data){ //若data为null:表示删除失败
    9. console.log(‘删除失败:’+data)
    10. }
    11. })

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

    1. //删除bookid为1012的文档
    2. Book.deleteOne({
    3. 'bookId':1012
    4. },function (err,data) {
    5. if (err){
    6. console.log(err)
    7. }else if(data){
    8. console.log('删除成功:'+data)
    9. }
    10. })

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

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

    1. Book.findOneAndUpdate(
    2. { 'bookId':1001}, //表示查询的条件
    3. {$set:{'count':15}}, //更新语句
    4. null,//表示查询操作,通常为null
    5. function (err,data) { //更新回调函数:err表示数据库的错误信息,data中存放的findOne查询到的文档
    6. if (err){ //err表示数据库错误:查询、更新时数据库出现异常
    7. console.log(err)
    8. }else if(!data){ //data为null时,表示没有找到相应的文档
    9. console.log('未找到相应的数据:'+data)
    10. }else if(data){ //data不为null,表示找到了相应的文档,data中保存的是更新前的文档
    11. console.log('更新成功:'+data)
    12. }
    13. })

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

    1. Book.updateOne({'bookId':1001},{$set:{'count':100}},function (err,data){
    2. if (err){
    3. console.log(err)
    4. }
    5. console.log(data.modifiedCount) //data是对象,modifiedCount属性表示被更新的记录数,不为0即更新成功
    6. })

    (6)查询所有:find

    1. Book.find(function (err,data){
    2. if (err){
    3. console.log(err)
    4. }
    5. console.log(data)
    6. })

    ​ (7)按_id查询:findById

    1. Book.findById({
    2. '_id':'2002000000c0000000000000'
    3. },function(err,data){
    4. if (err){
    5. console.log(err)
    6. }
    7. console.log(data)
    8. })

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

    1. Book.findOne({
    2. publishing:'机械工业出版社',
    3. count:10
    4. },function(err,data){
    5. if (err){
    6. console.log(err)
    7. }
    8. console.log(data)
    9. })

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

    1. Book.count(function (err,data){
    2. if (err){
    3. console.log(err)
    4. }
    5. console.log('记录数:'+data)
    6. })

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

    1. const express = require('express')
    2. const router = express.Router()
    3. const Book = require('../../db/model/bookModel')
    4. //定义查询所有接口:http://localhost:8089/mongoapi/findAll
    5. router.get('/findAll',(req,res)=>{
    6. Book.find((err,data)=>{
    7. if (err){
    8. return console.log(err)
    9. }
    10. res.json(data)
    11. })
    12. })
    13. module.exports = router
  • 相关阅读:
    C盘清理指南(四)——垃圾清理工具
    git初级
    Linux/Ubuntu环境搭建(二):创建添加新磁盘、搭建Samba服务器
    【Python】如果修改了第三方库(包)的源代码,该怎么做才能还原呢
    【Git 】常用指令
    C++入门(3):引用,内联函数
    如何快速集成Android版Serverless认证服务-手机号码篇
    Java集合
    MapUtils常用方法
    [Linux]记录plasma-wayland下无法找到HDMI接口显示器的问题解决方案
  • 原文地址:https://blog.csdn.net/m0_74331185/article/details/128120659