85.Mongoose指南 - Schema
轉(zhuǎn)自:https://www.bbsmax.com/A/pRdBnKpPdn/
定義schema
用mongoose的第一件事情就應(yīng)該是定義schema. schema是什么呢? 它類似于關(guān)系數(shù)據(jù)庫(kù)的表結(jié)構(gòu).
| 1 2 3 4 5 6 7 8 9 10 | var?mongoose = require('mongoose'); var?schema = mongoose.Schema; var?blogSchema =?new?Schema({ ????titile: String, ????body: String, ????comments: [{body: String, date: Date}], ????date: {type: Date,?default: Date.now}, ????hidden:Boolen }); |
創(chuàng)建model
格式是mongoose.model(modelName, schema);
| 1 | var?BlogModel = mongoose.model('Blog', blogSchema); |
實(shí)例化方法
model的實(shí)例是document. document有許多內(nèi)置的實(shí)例方法. 我們可以為document定義自己的實(shí)例方法
| 1 2 3 4 5 6 | var?animalSchema =?new?Schema({name: String, type: String}); //定義實(shí)例方法 animalSchema.methods.findSimilarType =?function(cb){ ??return?this.model('Animal').find({type:?this.type}, cb); } |
現(xiàn)在animal實(shí)例有findSimilarTypes方法了
| 1 2 3 4 5 6 | var?Animal = mongoose.model('Animal', animalSchema); var?dog =?new?Animal({type:?'dog'}); dog.findSimilarTypes(function(err, dogs){ ??console.log(dogs); }); |
Model靜態(tài)方法
還可以給Model添加靜態(tài)方法
| 1 2 3 4 5 6 7 8 9 10 | animalSchema.statics.findByName =?function(name, cb){ ???this.find({name:?new?RegExp(name,?'i')}, cb); } var?Animal = mongoose.model('Animal', animalSchema); Animal.findByName('fido',?function(err, animals){ ??console.log(animals); }); |
索引
索引分為field級(jí)別和schema級(jí)別. 如果使用復(fù)合索引那么必須使用schema索引
| 1 2 3 4 5 6 7 | var?animalSchema =?new?Schema({ ???name: String, ???type: String, ???tags: {type: [String], index:true}?// field level }); animalSchema.index({name:1, type:-1});?// schema level |
當(dāng)應(yīng)用啟動(dòng)的時(shí)候, mongoose會(huì)自動(dòng)為你的schema調(diào)用ensureIndex確保生成索引. 開發(fā)環(huán)境用這個(gè)很好, 但是建議在生產(chǎn)環(huán)境不要使用這個(gè).使用下面的方法禁用ensureIndex
| 1 2 3 | animalSchema.set('autoIndex',?false); //or new?Schema({}, {autoIndex:?false}); |
Virtual
virtual是document的屬性 你可以get,set他們但是不持續(xù)化到MongoDB. virtual屬性get非常有用可以格式化或者合并字段, ?set可以分解一個(gè)字段到多個(gè)字段并持續(xù)化到數(shù)據(jù)庫(kù)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | var?personSchema =?new?Schema({ ????name: { ????????first: String, ????????last: String ????} }); var?Person = mongoose.model('Person', personSchema); var?bad =?new?Person({ ???name: {first:?'Walter', last:?'White'} }); |
如果你想獲取bad的全名 你需要這樣做
| 1 | console.log(bad.name.first +?' '?+ bad.name.last); |
或者我們可以在personSchema中定義virtual getter. 這樣我們就不需要在每個(gè)要用fullname的地方拼接字符串了
| 1 2 3 | personSchema.virtual('name.full').get(function(){ ????return?this.name.first +?' '?+?this.name.last;? ); |
現(xiàn)在我么可以使用 name.full虛屬性了
| 1 | console.log(bad.name.full); |
我們還可以通過(guò)設(shè)置this.name.full來(lái)設(shè)置this.name.first和this.name.last
| 1 | bad.name.full =?"Breaking Bad"; |
?
| 1 2 3 4 5 6 7 8 9 10 11 | personSchema.virtual('name.full').set(function(name){ ???var?split = 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有一些配置選項(xiàng), 可以如下面一樣設(shè)置
| 1 2 3 4 5 | new?Schema({}, options); //or var?xxSchema =?new?Schema({}); xxSchema.set(option, value); |
option:autoIndex
應(yīng)用啟動(dòng)的時(shí)候Mongoose會(huì)自動(dòng)為每一個(gè)schema發(fā)送一個(gè)ensureIndex命令。 ?如果你想禁止自動(dòng)創(chuàng)建index要自己手動(dòng)來(lái)創(chuàng)建的話 你可以設(shè)置autoIndex為false
| 1 2 3 4 | var?xxSchema =?new?Schema({}, { autoIndex:?false?}); var?Clock = mongoose.model('Clock', xxSchema); Clock.ensureIndexs(callback); |
option:bufferCommands
todo
| 1 | var?schema =?new?Schema({}, { bufferCommands:?false?}); |
option:capped
todo?
....
總結(jié)
以上是生活随笔為你收集整理的85.Mongoose指南 - Schema的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nginx服务器配置/websocket
- 下一篇: json的键为变量而不是字符串时,怎么写