mongoose 小结

作者: 1ncounter | 来源:发表于2018-03-13 17:09 被阅读0次

    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

    相关文章

      网友评论

        本文标题:mongoose 小结

        本文链接:https://www.haomeiwen.com/subject/dwnzfftx.html