3.5 Schema的配置项
虚拟属性
Schema
中如果定义了虚拟属性,那么该属性将不写入数据库,例如:
var PersonSchema = new Schema({
name:{
first:String,
last:String
}
});
var PersonModel = mongoose.model('Person',PersonSchema);
var krouky = new PersonModel({
name:{first:'krouky',last:'han'}
});
如果每次想使用全名就得这样
console.log(krouky.name.first + ' ' + krouky.name.last);
显然这是很麻烦的,我们可以定义虚拟属性
:
PersonSchema.virtual('name.full').get(function(){
return this.name.first + ' ' + this.name.last;
});
那么就能用krouky.name.full
来调用全名了,反之如果知道full,也可以反解first
和last
属性
PersonSchema.virtual('name.full').set(function(name){
var split = name.split(' ');
this.name.first = split[0];
this.name.last = split[1];
});
var PersonModel = mongoose.model('Person',PersonSchema);
var krouky = new PersonModel({});
krouky.name.full = 'krouky han';//会被自动分解
console.log(krouky.name.first);//krouky
配置项
在使用new Schema(config)
时,我们可以追加一个参数options
来配置Schema
的配置,形如:
var ExampleSchema = new Schema(config,options);
或者使用
var ExampleSchema = new Schema(config);
ExampleSchema.set(option,value);
可供配置项有:safe
、strict
、capped
、versionKey
、autoIndex
safe——安全属性(默认安全)
一般可做如下配置:
new Schema({...},{safe:true});
当然我们也可以这样
new Schema({...},{safe:{j:1,w:2,wtimeout:10000}});
j
表示做1份日志,w
表示做2个副本(尚不明确),超时时间10秒
strict——严格配置(默认启用)
确保Entity
的值存入数据库前会被自动验证,如果你没有充足的理由,请不要停用,例子:
var ThingSchema = new Schema({a:String});
var ThingModel = db.model('Thing',SchemaSchema);
var thing = new Thing({iAmNotInTheThingSchema:true});
thing.save();//iAmNotInTheThingSchema这个属性将无法被存储
如果取消严格选项,iAmNotInTheThingSchema
将会被存入数据库
该选项也可以在构造实例时使用,例如:
var ThingModel = db.model('Thing');
var thing1 = new ThingModel(doc,true); //启用严格
var thing2 = new ThingModel(doc,false); //禁用严格
注意:
strict
也可以设置为throw
,表示出现问题将会抛出错误
shardKey
需要mongodb
做分布式,启用该属性会获取到共享KEY
capped——上限设置
如果有数据库的批量操作,该属性能限制一次操作的量,例如:
new Schema({...},{capped:1024}); //一次操作上线1024条数据
当然该参数也可是JSON对象,包含size、max、autiIndexId属性
new Schema({...},{capped:{size:1024,max:100,autoIndexId:true}});
versionKey——版本锁
版本锁是Mongoose
默认配置(__v属性)的,如果你想自己定制,如下:
new Schema({...},{versionKey:'__someElse'});
此时存入数据库的版本锁就不是__v
属性,而是__someElse
,相当于是给版本锁取名字。
具体怎么存入都是由Mongoose
和MongoDB
自己决定,当然,这个属性你也可以去除
new Schema({...},{versionKey:false});
除非你知道你在做什么,并且你知道这样做的后果
autoIndex——自动索引
默认开启
Last updated
Was this helpful?