Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。
什么是ODM? 其实和ORM(Object Relational Mapper)是同类型的工具。都是将数据库的数据转化为代码对象的库,使用转化后的对象可以直接对数据库的数据进行CRUD(增删改查)。
MongoDB 是文档型数据库(Document Database),不是关系型数据库(Relational Database)。而Mongoose可以将 MongonDB 数据库存储的文档(documents)转化为 javascript 对象,然后可以直接进行数据的增删改查。
Model : 由 Schema 发布生成的模型,具有抽象属性和行为的数据库操作对
Entity : 由 Model 创建的实体,他的操作也会影响数据库
1、Schema——纯洁的数据库原型
Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
什么是Schema.Type
Schema.Type 是由 Mongoose 内定的一些数据类型,基本数据类型都在其中,他也内置了一些 Mongoose 特有的 Schema.Type 。当然,你也可以自定义 Schema.Type ,只有满足 Schema.Type 的类型才能定义在 Schema 内。
var ExampleSchema = new Schema({
name:String,
binary:Buffer,
living:Boolean,
updated:Date,
age:Number,
mixed:Schema.Types.Mixed, //该混合类型等同于nested
_id:Schema.Types.ObjectId, //主键
_fk:Schema.Types.ObjectId, //外键
array:[],
arrOfString:[String],
arrOfNumber:[Number],
arrOfDate:[Date],
arrOfBuffer:[Buffer],
arrOfBoolean:[Boolean],
arrOfMixed:[Schema.Types.Mixed],
arrOfObjectId:[Schema.Types.ObjectId]
nested:{
stuff:String,
}
})
Buffer 和 ArrayBuffer 是 Nodejs 两种隐藏的对象
关于Mixed
Schema.Types.Mixed 是 Mongoose 定义个混合类型,该混合类型如果未定义具体形式。因此,如果定义具体内容,就直接使用 {} 来定义,以下两句等价
var AnySchema = new Schema({any:{}});
var AnySchema = new Schema{{any:Schema.Types.Mixed})
混合类型因为没有特定约束,因此可以任意修改,一旦修改了原型,则必须调用 markModified()
person.anything = {x:[3,4,{y:'change'}]}
person.markModified('anything');//传入anything,表示该属性类型发生变化
person.save()
关于ObjectId
主键,一种特殊而且非常重要的类型,每个 Schema 都会默认配置这个属性,属性名为 _id ,除非自己定义,方可覆盖
var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;
var StudentSchema = new Schema({}); //默认会有_id:ObjectId
var TeacherSchema = new Schema({id:ObjectId});//只有id:ObjectId
该类型的值由系统自己生成,从某种意义上几乎不会重复,生成过程比较复杂,有兴趣的朋友可以查看源码。
关于Array
Array 在 JavaScript 编程语言中并不是数组,而是集合,因此里面可以存入不同的值,以下代码等价:
var ExampleSchema1 = new Schema({array:[]});
var ExampleSchema2 = new Schema({array:Array});
var ExampleSchema3 = new Schema({array:[Schema.Types.Mixed]});
var ExampleSchema4 = new Schema({array:[{}]});
Documents
Document 是与 MongoDB 文档一一对应的模型, Document 可等同于 Entity ,具有属性和操作性
Model
Model 模型,是经过 Schema 构造来的,除了 Schema 定义的数据库骨架以外,还具有数据库行为模型,他相当于管理数据库属性、行为的类
Query
查询是数据库中运用最多也是最麻烦的地方,这里对 Query 解读的并不完善,仅仅是自己的一点领悟而已。
Validation
数据的存储是需要验证的,不是什么数据都能往数据库里丢或者显示到客户端的,数据的验证需要记住以下规则:
验证始终定义在 SchemaType 中
验证是一个内部中间件
验证是在一个 Document 被保存时默认启用的,除非你关闭验证
验证是异步递归的,如果你的 SubDoc 验证失败, Document 也将无法保存
验证并不关心错误类型,而通过 ValidationError 这个对象可以访问
验证器
required 非空验证
min / max 范围验证(边值验证)
enum / match 枚举验证/匹配验证
validate 自定义验证规则
Middleware中间件
中间件是一种控制函数,类似插件,能控制流程中的 init 、validate 、 save 、 remove方法
Population
因为MongoDB是文档型数据库,所以它没有关系型数据库joins(数据库的两张表通过"外键",建立连接关系。) 特性。也就是在建立数据的关联时会比较麻烦。为了解决这个问题,Mongoose封装了一个Population功能。使用Population可以实现在一个 document 中填充其他 collection(s) 的 document(s)。
网友评论