mongoose 小结

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)。

参考 https://segmentfault.com/a/1190000002727265

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容