MongoDB修炼手册(五)——nodejs中使用mongoose

362 阅读3分钟

前言

既然学习了那么多MongoDB的基本语法,是时候在项目中小试牛刀了。这里我使用了nodejs和mongoose来尝试前面所学的基本语法。另外也会涉及在项目中如何简单的进行模块化编写。

1、连接数据库

首先我们要安装mongoose,相当简单,百度都有相关的教程,这里就不写了。

连接数据库的操作如下:

const mongoose = require('mongoose');

// 连接数据库的url
mongoose.connect("mongodb://localhost:27017/test");

// 监听数据库连接状态,连接成功则可进行数据库操作
mongoose.connection.on("open", (err) => { 
  if(err) {
    console.log(err)
    return;
  }
  console.log('数据库连接成功')
  console.log('操作数据库')
})

2、创建约束

前面有讲到由于mongodb的结构松散不严格,所以导致mongodb的数据库不易于管理,于是mongoose为了保持数据的一致性,可以通过Schema创建约束。

const Schema = mongoose.Schema; // 引入Schema

const studentSchema = new Schema({
    stu_id: {
        type: String, // 类型
        require: true, 
        unique: true // 创建唯一索引
    },
    name: {
        type: String,
        require: true,
    },
    age: {
        type: Number,
        require: true,
    },
    sex: {
        type: String,
        require: true
    },
    hobby: [String], // 数组限制
    info: Schema.Types.Mixed, //接受所有类型
    date: {
        type: Date,
        default: Date.now()
    },
    enable_flag: {
        type: String,
        default: 'Y'
    }
})

可配置的选项其实还有很多,比如针对Number类型的max和min,可以限制插入数据的极值等等。详情参考Mongoose中文网

3、建立模型

约束制定好了之后要如何去对数据库进行增删查改呢?我们首先要建立模型,利用我们刚刚创建好的约束,进行实例化。

const stuModel = mongoose.model('stu', stuSchema)

这样操作之后我们在可视化工具中就可以看到一个新增的集合stus。

image.png

我们可以看到它这里是默认给我们的第一个参数加了个s作为集合名称。如果希望自己定义集合名称,可以传入第三个参数作为集合名。

4、操作数据库

万事具备了。回到连接数据库那一块,当我们监听到数据库连接成功后我们可以通过我们所定义的模型去进行数据库操作。

增:

stuModel.create({
    stu_id: '001',
    name: 'hp',
    sex: "男",
    age: 25,
  }, ((err, data) => {
      if(err) {
          return;
      }
      console.log('成功')
  })

查:

  stuModel.find({
    stu_id: '001'
  }, (err, data) => {
    if(err) {
      console.log(err);
      return;
    }
    console.log(data)
  })

改:

  stuModel.updateOne({
    stu_id: '001'
  }, {
    sex: '女'
  }, (err, data) => {
    if(err) {
      console.log(err);
      return
    }
    console.log(data)
  })

删:

 stuModel.deleteOne({
    stu_id: '001'
  }, (err, data) => {
    if(err) {
      console.log(err)
      return;
    }
    console.log(data)
  })

基本的操作讲完~不延伸了,因为真的太多太多,前面四篇基本涵盖了所有的东西了,语法上也是大同小异。

5、模块化

由于我们的数据库操作是需要在监听mongoose成功连接数据库后操作的。但在实际的项目中,我以上的代码不可能全部写到一个文件里面,所以我们需要将它切割成几个模块

(1)connection模块

这个模块主要是用于连接数据库,并且暴露一个方法,这个方法可以接受一个回调函数,如果数据连接成功,我们可以在返回的回调函数中进行数据库操作。

const mongoose = require("mongoose")
mongoose.set('useCreateIndex', true)

const connectMongo = (callback) => {
    mongoose.connect("mongodb://localhost:27017/test", {
        useNewUrlParser: true, // 使用一个新的URL解析器,解决安全性的问题
        useUnifiedTopology: true, // 使用一个统一的新的拓扑结构
    }) 
    
    // 连接数据库
    mongoose.connection.on('open', (err) => {
        if (err) {
            console.log('数据库连接失败', err);
        } else {
            console.log('数据库连接成功');
            callback();
        }
    })
}

 module.exports = connectMongo

(2)model模块

这个模块主要用于定义各个集合的约束,并暴露出它们的模型

比如我新增的成绩单集合

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const scoreSchema = new Schema({
    stu_id: {
        type: String,
        require: true,
        unique: true
    },
    name: {
        type: String,
        require: true,
    },
    score: {
        type: Number,
        max: 100,
        min: 0
    }
})

module.exports = mongoose.model("score", scoreSchema, "scoreList")

主文件调用

模块分好之后就是写接口的时候我们需要使用到之前所暴露出来的方法和模型

const scoreModel = require("../db/model/scroreList")
const db = require("../db/connection")

db(() => {
    // 操作数据库
   scoreModel.find({
    stu_id: '001'
  }, (err, data) => {
    if(err) {
      console.log(err);
      return;
    }
    console.log(data)
  })
})

结束

以上就是我近期所学所得。