共计 2855 个字符,预计需要花费 8 分钟才能阅读完成。
mongoose 是一个 ODM(Object Data Model) 的库,也叫做对象数据模型。那么为什么说是对象数据模型呢?
注:MongoDB 或者 Mongo 是 NoSQL 类型的数据库,也就是说是非关系型的数据库。
它被用来处理数据,实现对象间的转换。
数据处理:创建一个 Schema,提供 Schema 的数据验证功能。
对象的转换:这些对象是指开发过程中创建的对象和 MongodDB 中代表的相应对象。
如果不明白,或者似懂非懂,如果看了下文,相信你会明白不少。
常用的术语
Collections
Mongo 中的 Collections 相当于关系数据库中的表(tables),它包含了大量的 JSON 文档(document)。
Documents
Documents 相当于 SQL 中的记录(records)或者行(rows)。在 SQL 中需要用多个表,通过数据间的引用来表达数据间的关联,但是在 Mongo 中可以通过一个 Document 来实现。
Schema
SQL 定义一个 schema 通过表(table)的定义,而 MongoDB 中是没有这个的,如果我们使用 MongoDB 直接插入的就是一个 document。mongoose 它定义了一个 schema 来表示 document 的数据结构或者构造函数,它是建立在应用层面上的,每个 docuemnt 都是它的示例对象。
Fields
Fields 或者称之为属性,它相当于 SQL 中的列(columns),它用来形成一个个 schema。
Models
和 Schema 一样它也是一个数据结构或者构造函数,不过它更特殊。它使用 schema 创建了一个 Document 的实例,这个实例相当于 SQL 中的记录(record)。
mongoose 中的 Schema 和 Model
mongoose 中的 schema 是 document 的构造函数,使用它可以定义一个 document 的默认值,进行字段(fields)的验证。
mongoose 中的 model 提供了一个访问数据的接口,通过它可以实现对 document(也可以叫做记录) 的 CRUD(增,查,改,删)。
所以,可以这么说 model 是 Schema 的包装器,通过包装实现了 Schema 结构的数据与 MongoDB 数据库之间的交互。
注:在开发过程中,使用的都是 Model 和 Schema 的实例,所以可以理解文章开篇说的对象转换和对象数据模型。具体可参考下面的示例代码。
引用 mongoose
使用前需要先安装 mongooe,可通过 yarn install mongoose 来安装,然后通过如下代码来引用:
// 引用 mongoose
let mongoose = require(‘mongoose’)
说明:Schema 和 Model 不是显式的连接到了数据库,为什么这么说呢,因为开发的过程中,不是使用的 mongoose.connect(“mongodb://127.0.0.1:27017”) 返回的对象创建的 Schema 和 Model,而是直接使用的 mongoose 的引用,这样做的好处很明显,极大地提升了性能。
mongoose 定义使用了单例设计模式,所以使用 require 返回了一个单例对象,这在开发中比较常见,对于写自己的库有指导意义。
连接到 MongoDB 数据库
// 引用 mongoose
let mongoose = require(‘mongoose’)
// 连接到 demo 测试数据库
mongoose.connect(‘mongodb://127.0.0.1:27017/demo’)
定义一个 Schema
每一个 collection 中的所有 document 都使用同一个 Schema 定义的 field。每一个 document 对象的键名通过 Schema 来定义。
// 引用 mongoose
let mongoose = require(‘mongoose’)
// 连接到 demo 测试数据库
mongoose.connect(‘mongodb://127.0.0.1:27017/demo’)
// 定义并实例化一个 Schema
let userSchema = new mongoose.Schema({
firstname: String,
lastname: String
})
同样在 Schema 中可以对 field 进行验证,如:firstname 是 String 类型的。
Schema 的字段值可以是 Array,String,Boolean,Buffer,Date,Number,ObjectId,或者 Mixed(泛型,或者一个可变化的数据类型)。
定义并实例化一个 model
// 引用 mongoose
let mongoose = require(‘mongoose’)
// 连接到 demo 测试数据库
mongoose.connect(‘mongodb://127.0.0.1:27017/demo’)
// 定义并实例化一个 Schema
let UserSchema = new mongoose.Schema({
firstname: String,
lastname: String
})
// 定义一个 Model
let UserModel = mongoose.model(‘User’, userSchema)
// 实例化一个 Model
let person = new Usermodel({
firstname: ‘ 东坡 ’,
lastname: ‘ 苏 ’
})
可能有的人会比较疑惑,为什么 Schema 的定义和实例化可以放在一起,而 Model 的定义和实例化要分开?因为 schema 的实例不牵涉到具体的操作,而 Model 的实例往往牵涉到复杂的操作。所以前者在开发中往往两个步骤一起来做,后者分开来做。
mongoose 的 CRUD
添加数据
person
.save()
.then(doc => {
console.log(doc)
})
.catch(err => {
console.error(err)
})
查看数据
UserModel
.find({
lastname: ‘ 苏 ’ // query
})
.then(doc => {
console.log(doc)
})
.catch(err => {
console.error(err)
})
更新数据
UserModel
.findOneAndUpdate(
{
lasttname: ‘ 苏 ’ // query
},
{
firstname: ‘xxx’ // field:values 的更新
},
{
new: true, // 返回更新后的 document
runValidators: true // 在更新前进行验证
})
.then(doc => {
console.log(doc)
})
.catch(err => {
console.error(err)
})
删除数据
UserModel
.findOneAndRemove({
firstname: ‘ 东坡 ’
})
.then(response => {
console.log(response)
})
.catch(err => {
console.error(err)
})
当然,mongoose 还提供了很多很实用的 api,这里就不多说了。mongoose queries