12.mongoose

mongoose

mongoose 是一个操作 mongodb 的nodejs 驱动库。

什么驱动?

驱动是一个程序,其实就是提供了一套接口用来操作硬件。

mongodb 是数据库,nodejs 是js的一个运行环境,凭什么nodejs 可以操作 mongodb,所以这个时候就需要相应的驱动程序来提供接口。

mongoose 安装
npm i mongoose
连接 mongodb

连接mongodb的代码如下:

const mongoose = require('mongoose'); // 引入 mongoose 依赖包
const dbURI = 'mongodb://localhost/f69'; // 配置要连接的数据库
// 调用 mongoose 所提供的 connect 方法来连接数据库
mongoose.connect(dbURI,{useNewUrlParser : true,useUnifiedTopology: true});
// 监听 connected 事件,连接成功的话就会触发这个事件
mongoose.connection.on('connected',function(){
    console.log(`数据库已经连接成功,连接至${dbURI}`);
})
书写 Schema

什么是 Schema?Schema 是 mongoose 所提供的一个方法,用来定义mongodb 中所对应的数据集合的结构。换句话说,就是定义数据的骨架。

语法如下:

const usersSchema = new mongoose.Schema({
  username : String, // 用户名
  password : String, // 密码
  age : Number // 年龄
})

常见的 Schema Types 内置类型如下:

  • String
  • Number
  • Boolean
  • Array
  • Buffer
  • Date
  • ObjectId
  • Mixed

只有 Schema 里面对应的数据类型才能够被操作。

比如你在 Schema 里面定义的 age 为 Number 类型,但是在数据库里面你存的是 String,那么这个时候,你的查询结果里面就不会包含 age 字段。换句话说,我们在写 Schema的时候,定义类型需要和数据库里面的字段类型匹配上。

书写 Model

Model 是由 Schema 生成的数据模型,我们就是通过这个模型来对数据进行操作的。

语法如下:

mongoose.model(模型的名字,对应的Schema,Schema对应的集合);

具体示例如下:

require('./db');
const mongoose = require('mongoose');

// 定义 Schema,这是数据的骨架
const studentsSchema = new mongoose.Schema({
    name : String,
    gender : String,
    age : Number
})

// 生成 model
mongoose.model('studentsModel',studentsSchema,'students');
// 导出模型
module.exports = mongoose.model('studentsModel');

接下来书写dao文件,该文件负责具体的数据操作,代码如下:

// 这个文件做具体的数据操作,增删改查
// 引入之前定义的 model,因为增删改查操作都是基于那个 model
const studentModel = require('./studentModel');

// 查询
studentModel.find((err,data)=>{
    if(err) throw err;
    console.log(data);
});

新增数据

使用 create 方法方法可以新增一条数据。

studentModel.create({
    name : 'xiejie',
    age : 18,
    gender : '男'
},(err,data)=>{
    if(err) throw err;
    console.log(data,'xx');
})

修改数据

studentModel.update({"name":"xiejie"},{"name" : "谢杰"},(err,data)=>{
    if(err) throw err;
    console.log(data,'aaa');
})

删除数据

官方推荐 deleteOne 或者 deleteMany

studentModel.deleteOne({"name" : "谢杰"},(err,data)=>{
    if(err) throw err;
    console.log(data,'aaa');
})

条件查询

studentModel.find({"name" : "ii"},(err,data)=>{
    if(err) throw err;
    console.log(data,'aaa');
})
多个条件满足一个
studentModel.find({$or : [{},{},{}]})

三层架构

什么是三层架构?

三层架构来源于后端开发的一种分层的思想。

什么是三层架构?

引用自百科的解释:

三层架构(3-tier architecture)通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。

区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。

各层的作用如下:

  • **表示层:**主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。
  • **业务逻辑层:**主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。
  • **数据访问层:**主要看数据层里面有没有包含逻辑处理,实际上它的各个函数主要完成各个对数据文件的操作。而不必管其他操作。
具体的实现

首先看下面的图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lwCOd8N-1612237121208)(/Users/Jie/Library/Application Support/typora-user-images/image-20200922152523188.png)]

首先在项目根目录下面创建 dao 和 service 目录。

  • dao:持久层
  • service:业务层
  • routes:表现层

接下来每一层的代码如下:

首先是 dao 层,这一层负责连接数据库等相关操作,所以会涉及到 连接数据库、创建 model 和 使用 model 操作数据库。

// db.js
// 负责连接数据库

const mongoose = require('mongoose');
const dbURI = 'mongodb://localhost/f69'; // 配置要连接的数据库
mongoose.connect(dbURI,{useNewUrlParser : true,useUnifiedTopology: true});
mongoose.connection.on('connected',function(){
    console.log(`数据库已经连接成功,连接至${dbURI}`);
})
// studentModel.js
// 负责生成 model

require('../db');
const mongoose = require('mongoose');

// 定义 Schema,这是数据的骨架
const studentsSchema = new mongoose.Schema({
    name : String,
    gender : String,
    age : Number
},{versionKey: false})

// 生成 model
mongoose.model('studentsModel',studentsSchema,'students');
// 导出模型,之后,我们的增删改查操作都是基于这个 model 来执行的
module.exports = mongoose.model('studentsModel');
// studentsDao.js
// 负责使用 model 来操作数据库

// 这个文件做具体的数据操作,增删改查
// 引入之前定义的 model,因为增删改查操作都是基于那个 model
const studentModel = require('./model/studentsModel');

// 新增
module.exports.addStudentDao = async function(stu){
    return await studentModel.create(stu);
}

然后是 service 层,这一层主要负责业务逻辑处理,但是目前我们没有什么业务逻辑处理,所以只是单纯的调用持久层导出的方法。

// studentService.js

const { addStudentDao } = require('../dao/studentsDao')

module.exports.addStudentService = async function(stu){
    return await addStudentDao(stu);
}

然后是表现层,这一层负责接收前端传递过来的数据,然后传递给service层

var express = require('express');
var router = express.Router();
const { addStudentService } = require('../service/studentsService');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
  // res.send('hahah');
});

router.post('/addStu',async function(req,res){
  // 通过 req.body 拿到之后,接下来我们就想着将数据传递给下一层
  res.send(await addStudentService(req.body));
})

module.exports = router;

equire(’…/service/studentsService’);

/* GET home page. */
router.get(’/’, function(req, res, next) {
res.render(‘index’, { title: ‘Express’ });
// res.send(‘hahah’);
});

router.post(’/addStu’,async function(req,res){
// 通过 req.body 拿到之后,接下来我们就想着将数据传递给下一层
res.send(await addStudentService(req.body));
})

module.exports = router;




至此,整个三层架构就搭建完毕了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值