您现在的位置:首页 >> 前端 >> 内容

Mongoose之Schema实例讲解

时间:2017/12/25 10:38:55 点击:

  核心提示:定义schema用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的表结构.varmongoose = require(mongoose); vars...

定义schema

用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的表结构.

varmongoose = require('mongoose'); varschema = mongoose.Schema; varblogSchema =newSchema({ titile: String, body: String, comments: [{body: String, date: Date}], date: {type: Date,default: Date.now}, hidden:Boolen });

创建model

格式是mongoose.model(modelName, schema);

varBlogModel = mongoose.model('Blog', blogSchema);

实例化方法

model的实例是document. document有许多内置的实例方法. 我们可以为document定义自己的实例方法

varanimalSchema =newSchema({name: String, type: String}); //定义实例方法 animalSchema.methods.findSimilarType =function(cb){ returnthis.model('Animal').find({type:this.type}, cb); }

现在animal实例有findSimilarTypes方法了

varAnimal = mongoose.model('Animal', animalSchema); vardog =newAnimal({type:'dog'}); dog.findSimilarTypes(function(err, dogs){ console.log(dogs); });

Model静态方法

还可以给Model添加静态方法

animalSchema.statics.findByName =function(name, cb){ this.find({name:newRegExp(name,'i')}, cb); } varAnimal = mongoose.model('Animal', animalSchema); Animal.findByName('fido',function(err, animals){ console.log(animals); });

索引

索引分为field级别和schema级别. 如果使用复合索引那么必须使用schema索引

varanimalSchema =newSchema({ name: String, type: String, tags: {type: [String], index:true}// field level }); animalSchema.index({name:1, type:-1});// schema level

当应用启动的时候, mongoose会自动为你的schema调用ensureIndex确保生成索引. 开发环境用这个很好, 但是建议在生产环境不要使用这个.使用下面的方法禁用ensureIndex

animalSchema.set('autoIndex',false); //or newSchema({}, {autoIndex:false});

Virtual

virtual是document的属性 你可以get,set他们但是不持续化到MongoDB. virtual属性get非常有用可以格式化或者合并字段, set可以分解一个字段到多个字段并持续化到数据库

varpersonSchema =newSchema({ name: { first: String, last: String } }); varPerson = mongoose.model('Person', personSchema); varbad =newPerson({ name: {first:'Walter', last:'White'} });

如果你想获取bad的全名 你需要这样做

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

或者我们可以在personSchema中定义virtual getter. 这样我们就不需要在每个要用fullname的地方拼接字符串了

personSchema.virtual('name.full').get(function(){ returnthis.name.first +' '+this.name.last; );

现在我么可以使用 name.full虚属性了

console.log(bad.name.full);

我们还可以通过设置this.name.full来设置this.name.first和this.name.last

bad.name.full ="Breaking Bad";

personSchema.virtual('name.full').set(function(name){ varsplit = 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

Options

Schema有一些配置选项, 可以如下面一样设置

newSchema({}, options); //or varxxSchema =newSchema({}); xxSchema.set(option, value);

option:autoIndex

应用启动的时候Mongoose会自动为每一个schema发送一个ensureIndex命令。 如果你想禁止自动创建index要自己手动来创建的话 你可以设置autoIndex为false

varxxSchema =newSchema({}, { autoIndex:false}); varClock = mongoose.model('Clock', xxSchema); Clock.ensureIndexs(callback);

option:bufferCommands

todo

varschema =newSchema({}, { bufferCommands:false});

option:capped

todo

....

Tags:MO ON NG GO 
作者:网络 来源:Night_Empe