• Mongoose模式的扩展


    模式的扩展

    默认值

    默认值的类型:

    固定值、即使生成

    代码展示:    

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test1');
    var AppleSchema = new mongoose.Schema({
      appleName : {
        type : String,
        default : '江苏红果'
      },
      madeTime : {
        type : Date,
        default : Date.now //new Date()
      }
    });
    var Apple = mongoose.model('Apple',AppleSchema);
    var apple1 = new Apple();
    console.log('User:',apple1);

    模式修饰符

    类型:

    预定义的模式修饰符、自定义的setter修饰符、自定义的getter修饰符

    代码展示:   

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test1');
    var AppleSchema = new mongoose.Schema({
    appleName : {
      type : String,
      default : ' 江苏红果 ',
      trim : true
    },
    madeTime : {
      type : Date,
      default : Date.now //new Date()
    },
    address : {
      type : String,
      /*set : function(url){
        if(!url){
          return ;
         }
        if(-1 === url.indexOf('http://')&& -1 === url.indexOf('https://')){
          url = 'http://' + url;
        }
        return url;
      },*/
    get : function(url){
      if(!url){
        return ;
      }
      if(-1 === url.indexOf('http://')&& -1 === url.indexOf('https://')){
        url = 'http://' + url;
      }
      return url;
     }
    }
    });
    var Apple = mongoose.model('Apple',AppleSchema);
    /*var Apple = mongoose.model('Apple',{
      appleName : {
        type : String,
        trim : true
       },
      address : {
        type : String,
        set : function(url){
        if(!url){
        return ;
      }
      if(-1 === url.indexOf('http://')&& -1 === url.indexOf('https://')){
        url = 'http://' + url;
      }
      return url;
    }
    }
    });*/
    var apple1 = new Apple({
      appleName : ' 江苏红果 ',
      address : 'baidu.com'
    });

    /*apple1.save(function(err){
      if(err){
        return '保存出错了!';
      }
    });*/

    Apple.find(function(err,docs){
      if(err){
        return '查找失败了!';
      }
      console.log('数据库里面的数据为:',docs);
     });

    console.log('apple1为:',apple1.address);

    //default是schema里面特有的

      

    虚拟属性

    实现方式:

    Schema.virtual()

    代码展示: 

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test1');
    var AppleSchema = new mongoose.Schema({
      firstName : String,
      lastName : String
    });
    AppleSchema.virtual('fullName').get(function(){
      return this.firstName + '' + this.lastName;
    });
    AppleSchema.set('toJSON',{getters : true,virtual : true});
      var Apple = mongoose.model('Apple',AppleSchema);
      var apple1 = new Apple({
      firstName : 'app',
      lastName : 'le'
    });
    console.log('apple fullName:',apple1.fullName);
    console.log('JSON:',JSON.stringify(apple1));

        

    索引

    索引:

    唯一索引、辅助索引   //辅助索引 增加查询速度

    代码展示:

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test1');
    var AppleSchema = new mongoose.Schema({
    code : {
      type : Number,
      unique : true //唯一索引
    },
    name : {
      type : String,
      index : true //辅助索引
    }
    });

    模型的方法

    方法的分类 

    自定义静态方法、自定义实例方法

    代码展示:

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test1');
    var AppleSchema = new mongoose.Schema({
      code : {
        type : Number,
      },
      name : {
        type : String,
      }
      /*code : Number,
      name : String*/
    });
    /*
    静态方法
    */
    AppleSchema.statics.findByCode = function(code,cb){
      this.findOne({code:code},function(err,doc){
        cb(err,doc);
      });
    };
    /*
    实例方法
    */
    AppleSchema.methods.print = function(){
      console.log('appleName:',this.name);
    };
    var Apple = mongoose.model('Apple',AppleSchema);
    var apple = new Apple({
      code : 1,
      name : '江苏红果'
    });
    /*apple.save(function(err){
      if(err){
        return err;
      }
      Apple.findByCode(1,function(err,doc){
        console.log("静态方法打印的结果为:",doc);
      })
    });*/
    /*Apple.find(function(err,doc){
      console.log("doc为:",doc);
    });*/
    apple.print();

    数据的校验

    预定义的验证器:

    required、Number(max,min)、String(enum,match)

    自定义的验证器:

    validate

    代码展示:

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test1');
    var OrderSchema = new mongoose.Schema({
       count : {
          type : Number,
          //必须有值
          required : true,
          //最大值
          max : 1000,
          //最小值
          min : 10
       },
       intro : {
          type : String,
          //枚举类型
          enum : ['优','良','一般','差','特别差']
       },
       phone : {
          type : String,
          //正则验证
          match : /135/g,
          //自定义验证器
          validate : function(phone){
             return phone.length>10;
          }
       },

    });
    mongoose.model('Order',OrderSchema);

    var Order = mongoose.model('Order');
    var order = new Order({
       count : 1000,
       intro : '优',
       phone : '12567891350'
    });
    //order.count = 1;
    order.save(function(err){
       if(err){
          return console.log('保存出错了!',err);
       }
       console.log('保存成功');
    });

    中间件

    类型:

    文档中间件(init、validate、save、remove),查询中间件(count、find、findOne、findOneAndRemove、findOneAndUpdate、update)

    预处理中间件

    后置处理中间件

    代码展示:

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test1');
    var ResultSchema = new mongoose.Schema({
       address : String
    });
    //预处理中间件
    ResultSchema.pre('save',true,function(next,done){
       console.log('执行预处理中间件!');
       next();
       done();
    });
    //后置处理中间件
    ResultSchema.post('save',function(next){
       console.log('执行后置处理中间件!',next);
       next();
    })
    mongoose.model('Result',ResultSchema);

    var Result = mongoose.model('Result');
    var result = new Result();
    result.address = 'I am in GuangZhou';
    result.save();

    DBRef  

    DBRef的定义://相当于数据库里面表与表之间的联合查询,关联关系

    populate()

    代码展示:

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test5');
    var UserSchema = new mongoose.Schema({
       name : String
    });
    var BookSchema = new mongoose.Schema({
       title : String,
       author : {
        type : mongoose.Schema.ObjectId,
        ref : 'User'
     }
    });

    mongoose.model('User',UserSchema);
    mongoose.model('Book',BookSchema);

    var User = mongoose.model('User');
    var Book = mongoose.model('Book');

    var user = new User({
       name : '张三'
    });
    var book = new Book({
       title : '鬼故事',
       author : user
    });

    user.save(function(err){
       if(err) return console.log('作者保存失败!err=',err);
       /*book.save(function(err){
        if(err) return console.log('图书保存失败!err=',err);
     });
     Book.find().populate('author').exec(function(err,docs){
        console.log('信息为:',err,docs);
     });*/
     BookSchema.post('save',function(next){
        Book.find().populate('author').exec(function(err,docs){
           if(err) return console.log(err);
             console.log('保存成功后,查询的结果为:',docs);
        });
     });
     book.save(function(err){
        if(err) return console.log(err);
        console.log('图书信息保存成功!');
     });
    });

  • 相关阅读:
    Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale
    Codeforces Round #402 (Div. 2) D.String Game
    30.algorithm排序小结
    28.数值算法小结
    28.STL常用算法
    27.改变数据的数值算法
    26.不改变数据的数值算法
    25.不改变原生数据的STL algorithm
    24.迭代器(流迭代器,正向,反向迭代器,分配器,存储迭代器)
    22.允许重复的容器(unordered_multiset)
  • 原文地址:https://www.cnblogs.com/TomAndJerry/p/8979017.html
Copyright © 2020-2023  润新知