mongoose
是一个ODM(Object Data Model)的库,也叫作对象数据模型。那么为何说是对象数据模型
呢?html
注:MongoDB或者Mongo是NoSQL类型的数据库,也就是说是非关系型的数据库。node
它被用来处理数据,实现对象间的转换。git
若是不明白,或者似懂非懂,若是看了下文,相信你会明白很多。github
Collections
Mongo中的Collections
至关于关系数据库中的表(tables),它包含了大量的JSON文档(document)。mongodb
Documents
Documents
至关于SQL中的记录
(records)或者行
(rows)。在SQL中须要用多个表,经过数据间的引用来表达数据间的关联,可是在Mongo中能够经过一个Document
来实现。数据库
Schema
SQL定义一个schema
经过表(table)的定义,而MongoDB中是没有这个的,若是咱们使用MongoDB直接插入的就是一个document
。mongoose它定义了一个schema
来表示document
的数据结构或者构造函数,它是创建在应用层面上的,每一个docuemnt都是它的示例对象。设计模式
Fields
Fields
或者称之为属性,它至关于SQL中的列
(columns),它用来造成一个个schema
。api
Models
和Schema
同样它也是一个数据结构或者构造函数,不过它更特殊。它使用schema
建立了一个Document
的实例,这个实例至关于SQL中的记录
(record)。数据结构
mongoose中的schema
是document
的构造函数,使用它能够定义一个document
的默认值,进行字段(fields)的验证。mongoose
mongoose中的model
提供了一个访问数据的接口,经过它能够实现对document
(也能够叫作记录)的CRUD(增,查,改,删)。
因此,能够这么说model
是Schema
的包装器,经过包装实现了Schema
结构的数据与MongoDB数据库之间的交互。
注:在开发过程当中,使用的都是Model
和Schema
的实例,因此能够理解文章开篇说的对象转换
和对象数据模型
。具体可参考下面的示例代码。
使用前须要先安装mongooe
,可经过yarn install mongoose
来安装,而后经过以下代码来引用:
// 引用mongoose let mongoose = require('mongoose')
说明:Schema
和Model
不是显式的链接到了数据库,为何这么说呢,由于开发的过程当中,不是使用的mongoose.connect("mongodb://127.0.0.1:27017")
返回的对象建立的Schema
和Model
,而是直接使用的mongoose
的引用,这样作的好处很明显,极大地提高了性能。
mongoose定义使用了单例设计模式,因此使用require
返回了一个单例对象,这在开发中比较常见,对于写本身的库有指导意义。
// 引用mongoose let mongoose = require('mongoose') // 链接到demo测试数据库 mongoose.connect('mongodb://127.0.0.1:27017/demo')
每个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(泛型,或者一个可变化的数据类型)。
// 引用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
的实例每每牵涉到复杂的操做。因此前者在开发中每每两个步骤一块儿来作,后者分开来作。
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