zoukankan      html  css  js  c++  java
  • [转] mongoose 之Shema

         之见到我写点啥简直是奇迹,由于现在喜欢上玩转node.js +mongoose,个人爱好,靠近前端的又是英文文档,苦逼得很,悟出来一个写一个吧。之前喜欢误打误撞,网上搜索一点解决一下问题,后来实在难看得很,为啥,解决一个小问题又来大问题,刚解决完大问题,有来巨大的bug,所有必需系统的学习,就算爱折腾也得有点头绪,决定先认真看完文档再说吧,免得想开发点啥都折腾得没有兴趣了……。

        首先我们得知道Schema常用的有哪些数据类型,不能只知道需要一个见一个就用一个,这样会感觉一直在摸索中探寻,不能把握全局。
        

     Schema.Types  

    • String  字符串
    • Number 数字,什么int啊,float啊,double啊,都只有这个Number就哦了
    • Boolean | Bool
    • Array 数组
    • Buffer 二进制
    • Date 日期
    • ObjectId | Oid mongodb主键一般都是用{_id:Schema.Types.objectId}
    • Mixed 这个强大,混合型的,也就是当你不确定这个属性存什么的时候设置为它吧,如果在被确立类型赋值后,需要用到一个函数来通知修改这个类型。下文会讲到。
      如何定义使用呢,请往下看:
      var mongoose = require('mongoose');
      var ObjectId = mongoose.Schema.Types.ObjectId;
      当然可以简略使用,请看如下定义
    //定义children的子嵌套
    var child = new Schema({ name: String });
    //添加字段方式1
    var schema = new Schema({ name: String, age: Number, children: [child]});
    //添加字段方式2
    //var schema = new Schema;
    //    schema.add({name :String, age: Number, children: [child] });
    
    var Tree = mongoose.model('Tree', schema); 
    // 设置 schema 选项
    new Schema({ name: String }, { _id: false, autoIndex: false })


        重点讲的就是,我们在定义嵌套文档是一般都不需要自动生成的_id,和索引对不?我们只要在Schema的第二个参数里设置下即可:
        _id:false或者_id:0,禁止自动生成主键
        autoIndex:false 或者autoIndex:0 禁止自动创建索引
        对了 false可以用数字0表示,true嘛你懂的。还有跟多的选项供你按需使用。一大串。
         

         Options: 其他可选项

    • autoIndex: bool - 默认 true
    • bufferCommands: bool - 默认 true
    • capped: bool - 默认 false
    • collection: string - 无
    • id: bool - 默认 true
    • _id: bool - 默认 true
    • minimize: bool - controls document#toObject behavior when called manually - 默认 true
    • read: string
    • safe: bool - 默认 true.
    • shardKey: bool - 默认 null
    • strict: bool - 默认 true
    • toJSON - object - 无
    • toObject - object - 无
    • versionKey: bool - 默认 "__v" 这玩意儿有些讨厌,会自动在数据库里生成这个字段,最好禁用。

     

    Schema#method(method, [fn])

         这个method方法很不错,当我们增删查改完想返回必要数据是可以交给此方法来做。如果一个方法的时候在method第一个参数设定方法名字符串,第二个参数为回调函数,如下:

    var schema = kittySchema = new Schema(..);
    
    schema.method('meow', function () {
      console.log('meeeeeoooooooooooow');
    })
    
    var Kitty = mongoose.model('Kitty', schema);
    
    var fizz = new Kitty;
    fizz.meow(); // meeeeeooooooooooooow

        如果多个方法的时候,可以同时绑定,如下来使用。当然你也可以一个一个的如上面的列子来写。

    schema.method({
        purr: function () {}
      , scratch: function () {}
    });
    
    // later
    fizz.purr();
    fizz.scratch();

     Schema#path(path, constructor)

        这个path方法用于修改属性的类型,原来已经定义好的属性name的Schema类型为String,要改成Number就这样使用。 

    schema.path('name', Number) //修改name的数据类型

        如果要获取这个属性的数据类型,使用 

    schema.path('name') // 返回一个 Schema的类型

    Schema#post(method, fn)  

        对于这个方法,用处在于把自定义的处理方法添加到event  emitter事件循环上去,给shema注册事件并能接收model处理后返回的文档,使用model实例来调用。 

    var schema = new Schema(..);
    schema.post('save', function (doc) {
      console.log('this fired after a document was saved');
    });
    
    var Model = mongoose.model('Model', schema);
    
    var m = new Model(..);
    m.save(function (err) {
      console.log('this fires after the `post` hook');
    });

    Schema#static(name, fn)

     注册静态方法,用实例直接调用,不需要再new一下了

    var schema = new Schema(..);
    schema.static('findByName', function (name, callback) {
      return this.find({ name: name }, callback);
    });
    
    var Drink = mongoose.model('Drink', schema);
    Drink.findByName('sanpellegrino', function (err, drinks) {
      //
    });

  • 相关阅读:
    LeetCode:前K个高频单词【692】
    LeetCode:前K个高频元素【347】
    Java进阶教程:Lambda表达式与最佳实践
    《图说VR入门》——googleVR 他山之玉
    执行力:我的一些个人实践
    执行力:我的一些个人实践
    设计模式——迭代器模式详解
    P2P平台投宝金融跑路?为什么我没有中雷!
    P2P平台投宝金融跑路?为什么我没有中雷!
    NetWork——关于HTTP、HTTPS的知识总结
  • 原文地址:https://www.cnblogs.com/chris-oil/p/9136623.html
Copyright © 2011-2022 走看看