1.0 前言
Mysql 用对应的 ORM 框架, 那 MongoDB 一样有对应的 ORM 框架,在 Node.js 中 MongoDB 对应的 ORM 框架,我们一般用 Mongoose,对应文档是 Mongoose 文档,这节我们一起学习下 Mongoose 基本使用。
2.0 Mongoose 基本使用
2.0.1 安装
npm install mongoose --save
2.0.2 创建 Mongoose 实例
一样,我们还是在 db.js 里做初始化mongoose。
//app/db/mongodb.jsconst mongoose = require('mongoose')const { mongodb } = require('../config')const { logger } = require('../log4j/logger')const { port, host, pass, userName, database, authSource = 'admin', poolSize = 40 } = mongodblet connection/*** 这里我们初始化数据库连接*/async function initDB() {let mongoUrlif (userName && pass) {mongoUrl = `mongodb://${userName}:${pass}@${host}:${port}?authSource=${authSource}`} else {mongoUrl = `mongodb://${host}:${port}`}const mongooseDB = await mongoose.connect(mongoUrl, {poolSize: poolSize,dbName: database})connection = mongooseDB.connection}initDB()function getConnection() {return connection}module.exports = {initDB,getConnection,}
2.0.3 Model 定义
model 定义就是来描述数据库字段和我们对象间的映射关系。
// app/models/user.jsconst Mongoose = require('mongoose')const userSchema = new Mongoose.Schema({name: {type: String,required: true,},email: {type: String,required: true,},imgUrl: {type: String,required: true,}},{timestamps: true});Mongoose.model('User', userSchema);module.exports = Mongoose.model('User');
Mogoose 是通过 Schema 格式来描述的,因为 MongoDB 存都是 JSON 类型的数据,最好还是定义一套 Schema ,这样我们就能自动去校验数据的格式,是否缺少字段,这样能很好保证程序的健壮性。
2.0.4 使用 Model
接下来,我们改造下 controller 。
const User = require('../models/user')async function list(ctx) {const data = await User.find({})console.log(data)ctx.body = {data: data.map(ele => ({...ele._doc, id: ele._id})),success: true}}async function detail(ctx) {const id = ctx.params.idconst data = await User.findById(id)ctx.body = {data: data,success: true}}async function add(ctx) {const { path } = ctx.request.files.fileconst { name, email } = ctx.request.body // 获取 request body 字段const imgUrl = path.split("/static")[1]const user = new User({ name, email, imgUrl })const data = await user.save()ctx.body = {data: data,success: true,}}module.exports = {detail,list,add}
可以看到 add 方法里面,我们完全是操作 User 这个 Model 来控制数据库字段,假设现在 name 为 null ,就会报下面错误:
所以这种对 Model 定义,能很好的保证数据入库之前的校验,同时也大大减少后续对数据的残缺处理。
3.0 小结
这节主要讲 MongoDB 对应的 ORM 框架 Mogoose 的基本使用,这个在日常工作中也非常常见,可以对着Demo 看看源代码,Demo 地址。
