# koa 连接 mongodb

# 各式各样的数据库

  • mongodb: 按照文档(Json结构)来存储

  • Redis: key-value存储

  • FlockDB: 图存储

  • HBase: 列存储

# 为什么要用 NoSql ?

  • 简单(没有原子性、一致性、隔离性等复杂规范)

  • 便于横向拓展

  • 适合超大规模数据的存储

  • 很灵活地存储复杂结构的数据

# 简单尝试下:用户模块

  1. 安装 Mongoose 连接 MongoDB
yarn add mongoose -S
  1. 连接 Mongodb
const mongoose = require('mongoose');
// { useNewUrlParser: true } 新版mongo都加这个配置
mongoose.connect('mongodb+src://xxx:xxx', { useNewUrlParser: true }, () => {
  console.log('连接成功')
});
// 如果出错,也打印出错信息
mongoose.connection.on('error', console.error);
  1. 设计目录结构
app - 
    |-controller // 控制器目录 
    |-routes     // 路由目录, 路由里面具体的操作交给控制器操作
    |-models     // 数据库模型目录
  • routes/users.js
const Router = require('koa-router');
const router = new Router({ prefix: '/users' });
const { find, findById, create, update, delete:del } = require('../controllers/user');

router.get('/', find);

router.post('/', create);

router.get('/:id', findById});

router.put('/:id', update});

router.delete('/:id', del});

module.exports = router;
  1. 设计用户模块的Schema
  • 分析用户模块的属性
  • 编写用户模块的Schema
  • 使用Schema生成用户Model

设计Schema,一般我们会放在models目录下:如:app/models/users.js

const mongoose = require('mongoose');
const { Schema, model } = mongoose;

const userSchema = new Schema({
  __v: {
    type: Number,
    // 接口返回不展示该字段
    select: false,
  },
  name: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true,
    // 接口返回不展示该字段
    select: false
  }
})

// model('User', userSchema); 声明 User 集合, 用户模型就建好了
module.exports = model('User', userSchema);
  1. 使用Mongoose进行增删改查

在操作数据库时,我们一般再controller中进行: app/controllers/users.js

const User = require('../models/users');

class UserController {
  async find(ctx) {
    ctx.body = await User.find();
  }
  async findById(ctx) {
    const user = await User.findById(ctx.params.id);
    if (!user) {ctx.throw(404, '用户不存在')}
    ctx.body = user;
  }
  async create(ctx) {
    ctx.verifyParams({
      name: { type: 'string', required: true },
    })
    const user = await new User(ctx.request.body).save();
    ctx.body = user;
  }

  async update(ctx) {
    ctx.verifyParams({
      name: { type: 'string', required: true },
    })
    const user = await User.findByIdAndUpdate(ctx.params.id, ctx.request.body);
    if (!user) {ctx.throw(404, '用户不存在')}
    ctx.body = user;
  }

  async delete(ctx) {
    const user = await User.findByIdAndRemove(ctx.params.id);
    if (!user) {ctx.throw(404, '用户不存在')}
    ctx.body = user;
  }
}