Mongoose对MongoDB的近一步应用

今儿接着说Mongoose的近一步使用方法,这些方法也是在数据储存中会比较常用的,废话少说,直接看代码吧。


环境准备
创建Test文件夹,在该文件夹中安装mongoose模块。

设置默认值
设置默认值,这个很好理解,方便在用户不给值时自动加入我们设置的默认值。


var mongoose = require('mongoose');

mongoose.connect('mongodb://127.0.0.1:27017/test2');

var UserSchema = new mongoose.Schema({
  //如何一个数据的默认值
  nickname: {
    type: String,
    //设置默认值
    default: 'new user'
  },
  regTime: {
    type: Date,
    //设置一个动态的默认值
    default: Date.now
  }
});

var User = mongoose.model('User',UserSchema);

var user = new User();

console.log('user:', user);

});


模式修饰符
模式修饰符主要是为了更好的规范我们对数据的整理和储存,这里主要罗列常用的几种修饰符


var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/test2');

var User2 = mongoose.model('User',{
  name: {
    type: String,
    //去除前后空格trim
    trim: true 
  },
  blog: {
    type: String,
    //检查/设定数据特殊值
    set: function( url ) {
      if( !url ) return url;
      if( url.indexOf('http://') !== 0 && url.indexOf('https://')!==0 ) {
        url = 'http://' + url;
        return url;
      }else{
        return url;
      }
    }
  }
});

var user = new User2({
  name: '  Jxxx ',
  blog: 'baidu.com'
});

console.log('user:',user);

上面的set属性是指我们通过一定的方法来使数据达到我们想要的储存规范,这里就是要求网址必须含有http://来储存。 同样我们也可以在取值的时候也给设定一个方法,使得我们取得的数据符合我们需要的格式


var User = mongoose.model('User',{
  blog: {
    type: String,
    //在取值过程中检查是否需要添加'http://'
    get: function(url){
      if( !url ) return url;
      if( url.indexOf('http://') !== 0 && url.indexOf('https://')!==0 ) {
        url = 'http://' + url;
        return url;
      }else{
        return url;
      }
    }
  }
});

var user = new User({
  blog: 'baidu.com'
});

user.save(function(err) {
  if(err){ return console.log(err); }
  console.log('url',user.blog);
});

需要注意的是模式修饰符是使用在模式设置中,而不是一个实例对象,也就是用在Schema的创建中。

虚拟属性的使用 virtual 所以虚拟属性其实类似于JS中prototype,让该模式拥有一个特定的功能,但是该属性是不会作为数据存入到数据库中。


var mongoose = require('mongoose');

var PersonSchema = new mongoose.Schema({
  firstName: String,
  lastName: String
});

//定义一个虚拟属性,该属性是不会写入数据库的
PersonSchema.virtual('fullName').get(function() {
  return this.firstName+' '+this.lastName;
});

var Person = mongoose.model('Person',PersonSchema);

var person = new Person({
  firstName: 'cao',
  lastName: 'Chen'
});

console.log('person: ',person.fullName);

假如我们想要得到虚拟属性中数据咋办呢,这里就需要通过JSON来处理了

........
//设置在转换为JSON数据时将虚拟属性写入
PersonSchema.set('toJSON',{getters: true, virtual:true});

var Person = mongoose.model('Person',PersonSchema);
var person = new Person({
  firstName: 'cao',
  lastName: 'Chen'
});

//转换为JSON数据,这里就会得到包含虚拟属性(值)的一个对象
console.log('Json: ',JSON.stringify(person));