# koa 连接 mongodb
# 各式各样的数据库
mongodb: 按照文档(Json结构)来存储
Redis: key-value存储
FlockDB: 图存储
HBase: 列存储
# 为什么要用 NoSql ?
简单(没有原子性、一致性、隔离性等复杂规范)
便于横向拓展
适合超大规模数据的存储
很灵活地存储复杂结构的数据
# 简单尝试下:用户模块
- 安装 Mongoose 连接 MongoDB
yarn add mongoose -S
- 连接 Mongodb
const mongoose = require('mongoose');
// { useNewUrlParser: true } 新版mongo都加这个配置
mongoose.connect('mongodb+src://xxx:xxx', { useNewUrlParser: true }, () => {
console.log('连接成功')
});
// 如果出错,也打印出错信息
mongoose.connection.on('error', console.error);
- 设计目录结构
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;
- 设计用户模块的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);
- 使用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;
}
}