Node.js--Mongoose使用进阶

Mongoose使用进阶

  • 模式的扩展
  • 模型的方法
  • 数据的校验
  • 中间件
  • DBRof

模式的扩展

默认值的类型:

  • 固定值
  • 即时生成
创建一个default.js:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;  
mongoose.connect('mongodb://localhost/part10',{useMongoClient: true});

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);

运行结果:


模式修饰符:

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

setter修饰符:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;  
mongoose.connect('mongodb://localhost/part10',{useMongoClient: true});

var User = mongoose.model('User', {
	nickname: {
		type: String,
		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;
			
			}
		}
});

var user = new User({
	nickname: "    Sid   ",
	blog: 'chensd.com'
});

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

运行结果:


getter修饰符:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/part10',{useMongoClient: true});

var User = mongoose.model('User', {
	blog: {
		type: String,
		get: function(url){
			if(!url) return url;

			if(0 !== url.indexOf('http://') && 0 !== url.indexOf("https://"))
				url = 'http://'+url;

			return url;
		}
	}
});

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

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

	console.log('blog url: ', user.blog);
});
运行结果:



虚拟属性:

  • Schema.virtual()
  • 转换为JSON

virtual.js:

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: 'Sid',
	lastName: 'chen'
});

console.log('user fullName', person.fullName);
运行结果:



转换为JSON:

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: 'Sid',
	lastName: 'chen'
});

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

console.log('JSON:', JSON.stringify(person));
运行结果:

注意:模型的实例在转换为JSON的时候,不会把虚拟属性放进去

可以通过添加下面一行代码,可以让模型的实例在转换为JSON的时候,把虚拟属性放进去

PersonSchema.set('toJSON', (getters:true, virtual: true));
运行结果:


索引:

  • 索引的目的
  • 唯一索引:可以检查是否唯一
  • 辅助索引:增加查询速度

var mongoose = require('mongoose');

var BookSchema = new mongoose.Schema({
	isbn: {
		type: Number,
		unique: true     //唯一索引
	},
	name: {
		type: String,
		index: true      //辅助索引
	}
});

模型的方法

  • 方法的分类
  • 自定义静态方法
  • 自定义实例方法

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/part10',{useMongoClient:true});

var BookSchema = new mongoose.Schema({
	name: String,
	isbn: Number
});

BookSchema.statics.findBtISBN = function(isbn, cb){        //静态方法
	this.findOne({isbn: isbn}, function(err, doc){
		cb(err, doc);
	});
};

BookSchema.methods.print = function(){                  //实例方法
	console.log('Book Information:');
	console.log('tTitle:', this.name);
	console.log('tISBN:', this.isbn);
};

var Book = mongoose.model('Book', BookSchema);

var book = new Book({
	name: 'MEAN Web Development',
	isbn:9787100
});

book.save(function(err){
	if(err){
		return console.log('save book filed', err);
	}

	Book.findBtISBN(9787100, function(err, doc){
		console.log('findByISBN, err, doc:', err, doc);
	});

	book.print();
});
运行结果:


注意:实例方法的结果在前面是调用执行静态方法后需要执行回调方法,直接下来执行实例方法,实例方法执行完后,静态方法回调查到结果。

数据校验

  • 预定义的验证器:require,Number(max, min),String(enum, match)
  • 自定义的验证器

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/part10',{useMongoClient:true});

var OrderSchema = new mongoose.Schema({
	count: {
		type: Number,                      //Number(max, min)预定验证器
		required: true,	   	               //required预定义验证器
		max: 1000,                
		min: 10
	},
	status: {
		type: String,
		enum: ['created', 'sucess', 'failed']
	},
	desc: {
		type: String, 		               //String(enum,match)预定义验证器
		match: /book/g,
		validate: function(desc) {         //自定义的验证器
			return desc.length >= 10;
		}
	}
});

var Order = mongoose.model('Order', OrderSchema);

var order = new Order();
order.count = 10;
order.status = 'created';
order.desc = 'this is a great book';

order.save(function(err){

	if(err){
		return console.log('save failed:', err);
	}
	console.log('save success');
})

中间件

  • 类型:文档中间件(init / validate / save / remove), 查询中间件(count  / find / findOne / findOneAndRemove / finfOneAndUpdate / update )
  • 预处理中间件
  • 后置处理中间件

文档中间件:当我们某一个文档在执行某些特定的操作的时候,触发的中间件(当把文档从数据库中取出来之后,变为node.js对象之前的时机)

查询中间件:当我们执行某个特定的查询操作的时候,触发的中间件

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/part10',{useMongoClient:true});

var ResellerSchema = new mongoose.Schema({
	address: String
});

ResellerSchema.post('save', function(next){
	console.log('this is ResellerSchema post save middleware');
	next();
});

ResellerSchema.pre('save', true, function(next, done){
	console.log('this is ResellerSchema pre save middleware');
	next();
	done();
});

var Reseller = mongoose.model('Reseller', ResellerSchema);

var reseller = new Reseller({
	address: '101st, People Read'
});

reseller.save();
运行结果:



DBRef

  • DBRef的定义
  • populate()

代码:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/part10',{useMongoClient: true});

var User = mongoose.model('User', {
	username: String
});

var News = mongoose.model('News', {
	title: String,
	author: {
		type: mongoose.Schema.ObjectId,
		ref: 'User'
	}
});

var user = new User({
	username: 'Sid'
});

var news = new News({
	title: 'Congratulation!',
	author: user
});

user.save(function(err){
	if(err) {
		return console.log('save user failed:', err);
	}
	news.save(function(err){
		if(err) {
			return console.log('save news failed:', err);
		}

		News.findOne().populate('author').exec(function(err, doc){
			console.log('after populate:', err, doc);
		});
	});
});


运行结果:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值