个人博客

A web front-end programmer's personal blog.

Mongoose的使用测试用例

####Mongoose的使用测试用例

精华基础讲解博客,点击这里

####快速开始示例

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/testData');

var db = mongoose.connection;

db.on('error',function(){
	console.log('链接失败');
});

db.once('open',function(){
	// 声明 属性 和 方法
	var kittySchema = mongoose.Schema({
		name : String,
		age : Number,
		color : String
	});

	kittySchema.methods.speak = function(){
		return this.name ? "Meow name is "+ this.name : "I don't have a name";
	};

	kittySchema.statics.findAll = function(cb){
		return this.find({},cb);
	};

	kittySchema.methods.findKitten = function(cb){
		return this.model('Kitten').find({},cb);
	};

	// 构造 实例模型
	var Kitten = mongoose.model('Kitten',kittySchema);


	// 构造 实例对象
	var slience = new Kitten({
		name : 'Slience',
		age : 3,
		color : 'white'
	});

	var fluffy = new Kitten({
		name : 'Fluffy',
		age : 2,
		color : 'black'
	});

	console.log(slience.name,slience.color);
	console.log(slience.speak());

	// 将实例对象保存到数据库中
	slience.save(function(err,obj){
		if (err) {
			console.log(err,'保存失败');
		}else{
			console.log(obj);
		}
	});

	fluffy.save(function(err,obj){
		if (err) {
			console.log(err,'保存失败');
		}else{
			console.log(obj);
		}
	});
	
	//methods 和 statics 调用
	Kitten.findAll(function(err,objs){
		console.log('statics查找所有',objs);
	});

	slience.findKitten(function(err,objs){
		console.log('methods查找所有',objs);
	});
});

运行后结果:

Slience white
Meow name is Slience
{ _id: 564ad0aa40aedbca97b3822a,
  color: 'white',
  age: 3,
  name: 'Slience',
  __v: 0 }
{ _id: 564ad260eb9db61a98cb7465,
  color: 'black',
  age: 2,
  name: 'Fluffy',
  __v: 0 }

在可视化工具中观察如下 :

####methods 和 statics 区别示例

定义 methods 注意 return this.model('name')

// define a schema
var animalSchema = new Schema({ name: String, type: String });

// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ type: this.type }, cb);
}

使用methods,在实例对象上使用 dog.findSimilarTypes

var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({ type: 'dog' });

dog.findSimilarTypes(function (err, dogs) {
  console.log(dogs); // woof
});

定义和使用 statics,定义时return this 使用时时在 Model实例上使用Animal.findByName

// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
}

var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
  console.log(animals);
});

####virtual使用示例

虚拟属性,可以设置和获取定义的值,不会保存到mongoDB中。

// define a schema
var personSchema = new Schema({
  name: {
    first: String,
    last: String
  }
});

// compile our model
var Person = mongoose.model('Person', personSchema);

// create a document
var bad = new Person({
    name: { first: 'Walter', last: 'White' }
});

console.log(bad.name.first + ' ' + bad.name.last); // Walter White

personSchema.virtual('name.full').get(function () {
  return this.name.first + ' ' + this.name.last;
});
console.log('%s is insane', bad.name.full); // Walter White is insane

反之也可以设置

personSchema.virtual('name.full').set(function (name) {
  var split = name.split(' ');
  this.name.first = split[0];
  this.name.last = split[1];
});
mad.name.full = 'Breaking Bad';
console.log(mad.name.first); // Breaking
console.log(mad.name.last);  // Bad

####schema验证器

  • required 非空验证
  • min/max 范围验证(边值验证)
  • enum/match 枚举验证/匹配验证
  • validate 自定义验证规则

      var PersonSchema = new Schema({
           name:{
              type:'String',
              required:true //姓名非空
            },
            age:{
              type:'Nunmer',
              min:18,       //年龄最小18
              max:120     //年龄最大120
            },
            city:{
              type:'String',
              enum:['北京','上海']  //只能是北京、上海人
            },
            other:{
              type:'String',
              validate:[validator,err]  //validator是一个验证函数,err是验证失败的错误信息
            }
          });
    

####一些关于Model的增删改查方法实例

find

PersonModel.find({"name":"blue"},function(err,persons){
	if(err){
		console.log('error');
		return ;
	}
	console.log(persons);
});

findById

var personSchema = mongoose.Schema({
		name : {
			type : String,
			required: true
		},
		age : {
			type : Number,
			min: 18,
			max: 120
		},
		city : {
			type : String,
			enum :['北京','上海']
		}
	});

	var PersonModel = mongoose.model('Person',personSchema);


	PersonModel.findById('564d2bfe6fb3718a0bcc192a',function(err,person){
		person.name = "jack";
		person.city = "北京";
		person.save(function(err,obj){
			if(err){console.log('error'); return ;}
			console.log('save success');
			console.log(obj);
		});

	});

update和findByIdAndUpdate

update第一个参数是查询条件,第二个参数是更新的对象,但不能更新主键。 需要注意,Document的CRUD操作都是异步执行,callback第一个参数必须是err,而第二个参数各个方法不一样,update的callback第二个参数是更新的数量,如果要返回更新后的对象,则要使用findByIdAndUpdate方法,findByIdAndUpdate只能基于id查找。

PersonModel.update({_id:'564d2ccd5509a3fc0b6c0dbd'},{$set:{name:'luccy',age:26}},function(err,mesg){
	if(err){
		console.log('error');
		return ;
	}
	console.log(mesg);
});

PersonModel.findByIdAndUpdate({_id:'564d2ccd5509a3fc0b6c0dbd'},{$set:{name:'luccy',age:26}},function(err,person){
	if(err){
		console.log('error');
		return ;
	}
	console.log(person);
});

save和create

两种新增方法区别在于,如果使用Model新增时,传入的对象只能是纯净的JSON对象,不能是由Model创建的实体,原因是:由Model创建的实体krouky虽然打印是只有{name:’krouky’},但是krouky属于Entity,包含有Schema属性和Model数据库行为模型。如果是使用Model创建的对象,传入时一定会将隐藏属性也存入数据库,虽然3.x追加了默认严格属性,但也不必要增加操作的报错

var tom = {
	"name" : "tom",
	"age" : 24,
	"city" : "江苏",
};

PersonModel.create(tom,function(err,person){
	if(err){
		console.log('error');
		return ;
	}
	console.log(person);
});

var daivd = new PersonModel({
	"name" : 'daivd',
	"age" : 26,
	"city" : "山东"
});

daivd.save(function(err,person){
	if(err){
		console.log('err');
		return;
	}
	console.log(person);
});

remove

PersonModel.remove({name:'blue'},function(err){
	if(err){
		console.log('err');
		return;
	}
	console.log('success');
});