• Express框架操作MongoDB数据库


    1、Mongoose模块

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

    (2)名词:

             1️⃣Schema:它是一种以文件形式存储的数据库模型骨架,不具备对数据库操作的能力,仅仅只是数据库在程序片段中的一种表现,可以理解为表结构。

            2️⃣Model:由Schema发布生成的模型,具有抽象属性和行为的数据库操作

            3️⃣Entity:由Model创建的实体,它的操作也会影响数据库

    (3)命名规范:驼峰命名 例:

            PersonSchema:Person对应的Schema ,Person的文本属性(表结构)

            PersonModel:Person对应的Model

            PersonEntity:Person对应的Entity

    Schema生成Model,由Model生成Entity,Model和Entity都可以操作数据库,Model的可操作性更强。

    3、Mongoose模块的使用

            (1)安装:npm install mongoose

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

                    

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

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

                     1️⃣Schema:定义的是与集合对应的骨架。Schema中的属性对应的是MongoDB中集合的key。

                     2️⃣是Schema的实例,用于操作MongoDB中的集合中的文档。

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

    (1)数据库中没有集合

            mongoose.model('Admin',AdminSchema) ——>在模型名后加s就是集合名(不区分大小写) ——admins

            mongoose.model('Admin',AdminSchema,'admin')——>第三个参数就是用于定义的集合名称

    (2)数据库中有集合

            mongoose.model('Admin',AdminSchema,'数据库中已有的集合名')

    5、mongoose的基本操作

    (1)插入文档:save方法

          1️⃣先使用Model创建Entity

          2️⃣然后使用Entity调用save方法

    1. const AdminModel = require('../model/adminModel');
    2. // 通过model创建一个对象
    3. const admin = new AdminModel({
    4. _id:'1005',
    5. userName:'唐僧',
    6. password:'123456',
    7. address:'东土大唐'
    8. })
    9. /*
    10. * 通过对象调用save方法向数据库中插入数据err存放的是保存失败后的信息 res是保存的对象
    11. */
    12. admin.save((err,res)=>{
    13. if(err){
    14. console.log(err);
    15. }else{
    16. console.log(res);
    17. }
    18. })

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

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

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

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

    1. AdminModel.findOneAndUpdate(
    2. {'_id':'1004'}, //表示查询的条件
    3. {$set:{'password':'789567'}}, //更新语句
    4. null, //表示查询操作,通常为null
    5. (err,data)=>{ //更新回调函数,err表示数据库的错误信息,data中存放的findOne查询到的文档
    6. if(err){
    7. console.log(err); //err表示数据库错误:查询、更新时数据库出现异常
    8. }else if(!data){ //data为null时表示没有找到对应的文档
    9. console.log('更新失败~');
    10. }else if(data){ //data不为null时表示找到对应的文档
    11. console.log('更新成功~')
    12. }
    13. })

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

    1. AdminModel.updateOne({'password':'123456'},{$set:{'password':'567890'}},(err,data)=>{
    2. if(err){
    3. console.log(err);
    4. }
    5. console.log(data.modifiedCount);
    6. })

    (6)查询所有:find

    1. AdminModel.find((err,data)=>{
    2. if(err){
    3. console.log(err);
    4. }
    5. console.log(data);
    6. })

    (7)按_id查询:findById

    1. AdminModel.findById({
    2. '_id':'1004'
    3. },(err,data)=>{
    4. if(err){
    5. console.log(err);
    6. }
    7. console.log(data);
    8. })

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

    1. AdminModel.findOne({
    2. address:'三国',
    3. password:'123456'
    4. },(err,data)=>{
    5. if(err){
    6. console.log(err);
    7. }
    8. console.log(data)
    9. })

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

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

  • 相关阅读:
    EasyX趣味化编程note2,绘制基本图形
    助贷系统设计
    5.wifi开发【智能家居:上】,开发准备:智能开关灯,智能采集温湿,智能调彩灯
    对比分析小游戏引擎孰优孰劣
    优化 | Management Science 7-8月文章精选: 信息系统中的运筹学
    lc[栈与队列]---225.用队列实现栈
    docker搭建nacos集群并用mysql做持久化
    HTTPS 的加密流程的总结
    目标检测YOLO实战应用案例100讲-基于YOLO的道路交通标志识别(续)
    [笔记]SSH 端口转发
  • 原文地址:https://blog.csdn.net/m0_73634593/article/details/128209539