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,也可以反解firstlast属性

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

可供配置项有:safestrictcappedversionKeyautoIndex

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,相当于是给版本锁取名字。

具体怎么存入都是由MongooseMongoDB自己决定,当然,这个属性你也可以去除

  new Schema({...},{versionKey:false});

除非你知道你在做什么,并且你知道这样做的后果

autoIndex——自动索引

默认开启

Last updated

Was this helpful?