• NodeJS连接MongoDB数据库(数据校验,增删查改)


    Node连接MongoDB

    原生JS连接MongoDB太麻烦了,所以需要使用第三方库:mongoose

    一、Mongoose

    mongoose是一个ODM(对象文档模型),JS对象可以映射成文档,所以叫对象文档模型。JSON -> BSON。

    为什么用?现在node平台下更加简单、高效、安全、稳定的操作MongoDB

    1.1优势

    1. 为文档创建一个模式结构
    2. 可以对模型中的对象进行验证
    3. 数据可以通过类型转换为对象模型
    4. 可以用中间件来应用业务逻辑挂钩
    5. 比原生更方便

    1.2 核心对象

    二、Node操作数据库前的准备

    2.1 连接数据库

    // 引入mongoose
    const mongoose = require('mongoose');
    /*
     * 首先需要根据一个地址去连接数据库,所以先创建一个地址字符串,有几个注意点
     * 1.协议名是 mongodb
     * 2.端口号不要错
     * 3.除了端口号,还需要指定具体连接哪儿一个数据库,在端口号后面跟随,如下连接的是test库
     */
    const dbURL = 'mongodb://localhost:27017/test';
    // 连接数据库
    mongoose.connect(dbURL);
    // 绑定数据库连接监听
    mongoose.connection.on("open", (err) => {
        if(err) {
            cosnole.log("connect failed...", err);
        } else {
            console.log("Success!");
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    需要注意的是,连接操作是一个异步操作,如果需要在连接之后进行数据库操作,那么需要进行异步处理,或把操作逻辑放在上述代码的else里面。

    2.2 解决报错

    上述代码有一些问题,会触发两个报错,这是因为API有变动,新版本,在连接数据库的时候,需要指定一个配置对象。

    mongoose.connect(dbURL, {
        // 内置了两个URL解析器,而现在默认是使用久的,会有安全问题等等
        // 那么下面的配置就是说,要是用新版本的URL解析器
        useNewUrlParser: true,
        // 统一拓扑结构,老的结构有一些效率问题
        // 那么下面的配置就是说,当操作数据库的时候使用
        useUnifiedTopology: true
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3 增删查改之前的操作

    当进行增删改查之前,我们需要了解几个核心的对象,因为很多接口都是放在他们的身上的。

    同时,在进行增删改查之前,我们还需要对数据进行校验,因为MongoDB的自由度很高,所以校验工作需要自己在后端代码中添加对应逻辑。

    mongoose.connection.on("open", (err) => {
        if(err) {
            cosnole.log("connect failed...", err);
        } else {
            console.log("Success!");
            // 把数据库看做是一个别墅,对于进入别墅的人要进行确认才可放行(校验后进行增删改查)
            // 1.请一个保安守门
            let Schema = mongoose.Schema;
            // 2.制定进入别墅的规则(进行增删改查的数据的格式校验)
            let enterRule = new Schema({
                name: {
                    type: String,
                    required: true
                },
                id_num: {
                    type: Number, // 设置编号只能为数字
                    required: true, // 必填
                    unique: true// 必须唯一 
                },
                sex: {
                	type: String,
    	            required: true
            	},
                hobby: [String], // 数组,其中只能填字符串
                info: Schema.Types.Mixed, // 所有类型都行
                date: { // 操作该数据的时候的时间
                    type: Date,
                    default: Date.now() // 如果没有写,设定默认值
                }
            }) 
            // 3.告诉保安自己制定的放行规则(绑定拦截器,去验证数据)
            // 用户生成某个集合对应的模型对象
            let enterModel = mongoose.model("enter", enterRule) 
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    上面的代码使用了一种通俗的语言去注释每一步,但是规范的说法应该是这样的:

    1. 引入模式对象
    2. 创建约束对象
    3. 创建模型对象

    三、Node对MongoDB增删查改

    在上面我们创建了一个名为enterModel的模型对象,而进行增删查改的接口就在这上面。

    3.1 增

    下面代码是紧接着上面的代码写的

    console.log("Success!");
    ... // 上面写过的就不再复制过来占地方了
    
    // 4.真正有人来了,要进入别墅了
    enterModel.create({
        name: "Arui",
        id_num: 10086011,
        sex: "male",
        hobby: ["乒乓球","网络游戏"], 
        info: {
            remarks: "Noting" 
        }
    }, (err, data) => {
        if(!err) console.log(data);
        else console.log(err);
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    上面使用了一个create方法去实现写入,这个方法接收两个参数,第一个参数为插入对象,第二个参数为操作后的回调函数,回调函数第一个参数为错误对象,第二个参数为成功增添的数据。

    3.2 查

    和上面一样的格式,我就直接写了:

    // 5.查询
    enterModel.find({name:"菜菜菜"}, (err, data) => {
        // find方法返回的是一个数组
        // 就算是只有一条数据,也是数组
        // 如果查询结果为空,返回空数组
        if (!err) {
            console.log(data);
        } else {
            console.log(err);
        }
    })
    
    // 查询单个,使用findOne方法
    // 如果查询到,直接返回,不用数组包裹
    // 如果没有查询到,返回Null
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.3 改

    有两个方法可以用:

    模型对象.updateOne(查询条件,要更新的内容)

    模型对象.updateMany(查询条件,要更新的内容)

    几个点:

    1. 上面两个方法都可以追加第三个参数,配置对象参数
    2. 不管有几个参数,回调函数放在最后一个参数就行了,同样接收 err 和 data
    3. 存在update方法,但是不要用,不知道什么时候就被废弃了,如果使用这个接口,当条件查询匹配到多个的时候,依然只修改一个

    3.4 删

    删除有两个方法可以用:

    模型对象.deleteOne(查询条件)

    模型对象.deleteMany(查询条件)

    注意:

    和update不一样!没有delete方法!

  • 相关阅读:
    RabbitMq 高级特性及整合SpringBoot学习总结
    线程是如何在 6 种状态之间转换的?
    关于访问权限控制问题
    智慧城市-疫情流调系列4-Prompt-UIE,生成式通用信息抽取-paddlenlp
    【面试普通人VS高手】Kafka的零拷贝原理?
    LayaBox---TypeScript---泛型
    使用Colossal-AI进行优化的测试笔记
    字节有『芯』在跳动,了吗?YOLOv7目标检测实现:确实挺好;伯克利博士找工作的6个月;软件工程资源大列表 | ShowMeAI资讯日报
    Java基础知识面试题
    创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
  • 原文地址:https://blog.csdn.net/qq_51574759/article/details/127687945