Mongoose使用进阶
- 模式的扩展
- 模型的方法
- 数据的校验
- 中间件
- DBRof
模式的扩展
默认值的类型:
- 固定值
- 即时生成
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);
运行结果:
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);
});
});
});