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

文章目录

  • Node连接MongoDB
    • 一、Mongoose
      • 1.1优势
      • 1.2 核心对象
    • 二、Node操作数据库前的准备
      • 2.1 连接数据库
      • 2.2 解决报错
      • 2.3 增删查改之前的操作
    • 三、Node对MongoDB增删查改
      • 3.1 增
      • 3.2 查
      • 3.3 改
      • 3.4 删

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!");
    }
})

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

2.2 解决报错

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

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

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. 创建模型对象

三、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);
})

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

3.2 查

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

// 5.查询
enterModel.find({name:"菜菜菜"}, (err, data) => {
    // find方法返回的是一个数组
    // 就算是只有一条数据,也是数组
    // 如果查询结果为空,返回空数组
    if (!err) {
        console.log(data);
    } else {
        console.log(err);
    }
})

// 查询单个,使用findOne方法
// 如果查询到,直接返回,不用数组包裹
// 如果没有查询到,返回Null

3.3 改

有两个方法可以用:

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

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

几个点:

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

3.4 删

删除有两个方法可以用:

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

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

注意:

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

你可能感兴趣的:(笔记,mongodb,数据库,nosql,node.js,后端)