课程名称:web前端架构师
课程章节:第14周 第八章 添加 Mongoose 以及 egg.js 插件原理
主讲老师:张轩
课程内容: Mongose 的基本用法
使用原生mongoDB 存在的问题
使用 原生的 mongoDB nodejs driver 数据结构以及操作过于灵活,使用起来也不是舒服。
解决
- 建立在 native mongoDB nodejs driver 之上
- 提出 Model,数据模型的概念,用来约束集合中的数据结构
- 非常多扩展的内容
- 它是一个 ODM(Object Document Mapping)工具。
谈谈 ORM
使用过关系型数据库的可能对这个比较熟悉
ORM 指的是 Object Relational Mapping
简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术。
优点
- 不需要再去写晦涩的 SQL 语句,对于我们不是专门做数据库的人比较友好
- 使用面向对象的方式操作数据,代码量少,语义性好,容易理解。比如
- Classes 类- Tables
- Objects 实例 - Records(表中的一行数据)
- Attributes 属性 - Records 中的值
- 内置很多功能,数据验证,清洗,预处理等等操作。
下面看下示例代码
//使用 sql 操作
let sql =
"INSERT INTO Users (username, password) VALUES ('john-doe', 'oomygooturulob')";
conn.query(sql, function (error, result) {
if (error) {
console.log(error);
} else {
console.log(result);
}
});
// 使用 ORM 进行操作
//Defining User model
const User = sequelize.define("User", {
username: Sequelize.STRING,
password: Sequelize.STRING,
});
//Inserting user
User.create({
username: "john-doe",
password: "okbro",
}).then(function (user) {
console.log(user);
}
上面代码中,其中 orm 使用了 sequelize 这个库,可以看到使用 orm 后代码对我们来说更容易理解
添加 Mongoose
安装 mongoose
npm i mongoose
连接 MongoDb
import mongoose from 'mongoose'
import config from './config.local'
export const connect = async function () {
try {
console.log('start connect...')
await mongoose.connect(config.uri, {
user: config.user,
pass: config.pass,
dbName: config.dbName,
})
mongoose.set('debug', true)
console.log('connect success')
} catch (e) {
console.log(e)
}
}
创建 Schema 和 Model
import mongoose, { Schema } from 'mongoose'
// 创建 Schema
const UserSchema = new Schema({
username: String,
password: {
type: String,
select: false
},
hobbies: [String],
date: Date,
createAt: Date,
age: Number
})
// 创建 Model
const User = mongoose.model('user', UserSchema)
export default User
插入一条数据
const user = await User.create({
username: 'admin',
password: '123456',
hobbies: ['play'],
date: new Date(),
createAt: new Date(),
age: 20,
})
await user.save()
也可以这样写
const user = new User({
username: 'root',
password: '123456',
hobbies: ['play'],
date: new Date(),
createAt: new Date(),
age: 20,
})
await user.save()
将现有的集合映射到 Model 上
mongoose 创建集合时,会把我们的 Model 名称全部改成小写,并在最后加上个 s 就是我们的集合名称。例如我们使用
const User = mongoose.model('User', UserSchema)
这时所对应的集合名称就时 users
当我们想让集合的名称是 user 时,可以
const UserSchema = new Schema({
username: String,
password: {
type: String,
select: false
},
hobbies: [String],
date: Date,
createAt: Date,
age: Number
}, {
// 这里的 collation 指的就是集合名称
collation: 'user'
})
查询
const user = await User.find()
// 这里也可以使用 User.findOne().limit(10).skip(2)
// 按 _id 查询 User.find({_id: 'xxx' })
console.log(user)
这里的使用与原生的 MongoDB 非常类似