MongoDB進(jìn)階

模式的擴(kuò)展

預(yù)定義模式修飾符

var UserSchema = new mongoose.Schema({
    nickname:{
        type:String,
        default:'zhong user'   //預(yù)定義名字
    },
    regTime:{
        type:Date,
        default:Date.now   //預(yù)定義時間
    }
});

自定義setter修飾符 (數(shù)據(jù)保存之前)

var User = mongoose.model('User', {
    nickname: {
        type: String,
        trim: true //修飾符 去空格
    },
    blog:{
        type:String,
        set:function(url){   //自定義 方法
            if(!url) return url;
            if(0 !== url.indexOf("http://") && 0 !== url.indexOf("https://")){
                url = "http://" + url;
                return url;
            }
            
        }
    }
});

自定義getter修飾符 ( 取出數(shù)據(jù)之后 )

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

模型的方法

靜態(tài)方法

var BookSchema = new mongoose.Schema({  //模式
    name: String,
    isbn: Number
});

//添加 靜態(tài)方法
BookSchema.statics.findByISBN = function(isbn, cb) {
    this.findOne({ isbn: isbn }, function(err, doc) {
        cb(err, doc);
    });
}

var Book = mongoose.model('Book',BookSchema);   //模型
var book = new Book({
    name:'NEAN IS FIDE',
    isbn:1314799
});

book.save(function(err){
    if(err){
        return console.log('sava is failed', err);
    }

    Book.findByISBN(1314799,function(err, doc){
        console.log('isok', err , JSON.stringify(doc))
    });

    book.print();

});

實(shí)例方法

var BookSchema = new mongoose.Schema({  //模式
    name: String,
    isbn: Number
});

//實(shí)例方法
BookSchema.methods.print = function(){
    console.log(this.name);
    console.log(this.isbn);
}

var Book = mongoose.model('Book',BookSchema);   //模型
var book = new Book({
    name:'NEAN IS FIDE',
    isbn:1314799
});

book.save(function(err){
    if(err){
        return console.log('sava is failed', err);
    }

    Book.findByISBN(1314799,function(err, doc){
        console.log('isok', err , JSON.stringify(doc))
    });

    book.print();

});

數(shù)據(jù)的校驗(yàn)

自定義蜈项,預(yù)定義驗(yàn)證器


var OrderScheme = new mongoose.Schema({
    count: {
        type: Number,
        required: true,   //預(yù)定義驗(yàn)證器 必須字段
        max:1000,        //預(yù)定義驗(yàn)證器 最大值
        min:10          //預(yù)定義驗(yàn)證器 最小值
    },
    status:{
        type:String,
        enum:['created', 'sucess', 'failed']
    },
    decs:{
        type:String,
        match: /book/g,      //預(yù)定義驗(yàn)證器 正則表達(dá)式
        validate:function(desc){     //自定義驗(yàn)證器
            return desc.length >= 10;
        }
    }
});

中間件

var ResellerSchema = new mongoose.Schema({
    address:String
});

//保存完成之后 后置處理中間件
ResellerSchema.post('save',function(next){
    console.log('this is save');
    next();
});

//保存之前
ResellerSchema.pre('save', true, function(next, done){
    console.log('zhiqian');
    next();
    done();
});

var Reseller = mongoose.model('Reseller', ResellerSchema);

var reseller = new Reseller({
    address:'123456'
});

reseller.save();

虛擬屬性

var PersonSchema = new mongoose.Schema({
    firstName:String,
    lastName:String
});

//虛擬屬性 fullName
PersonSchema.virtual('fullName').get(function(){
    return this.firstName+' '+ this.lastName; 
});

//將虛擬屬性添加 到JSON.stringify() 方法里面
PersonSchema.set('toJSON',{ getters:true, virtual:true });

var Person = mongoose.model('Person', PersonSchema);

var person = new Person({
    firstName:'zhong',
    lastName:'sheng'
});

DBref

var User = mongoose.model('User', {
    username: String
});

var News = mongoose.model('News', {
    title: String,
    author: {
        type: mongoose.Schema.ObjectId,
        ref: 'User' //關(guān)聯(lián)User 集合
    }
});

var user = new User({ username: 'zhong' });

var news = new News({
    title: 'congratulation',
    author: user
});

user.save(function(err) {
    if (err) {
        return console.log('so', err)
    }
    news.save(function(err) {
        if (err) {
            return console.log('so no', err)
        }
        
        // populate 指定填充字段 
        News.findOne().populate('author').exec(function(err,doc){
            console.log(JSON.stringify(doc));
        });

    });
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末督勺,一起剝皮案震驚了整個濱河市饭玲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌该贾,老刑警劉巖擅笔,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磨德,死亡現(xiàn)場離奇詭異,居然都是意外死亡剂公,警方通過查閱死者的電腦和手機(jī)希俩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纲辽,“玉大人颜武,你說我怎么就攤上這事⊥虾穑” “怎么了鳞上?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吊档。 經(jīng)常有香客問我篙议,道長,這世上最難降的妖魔是什么怠硼? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任鬼贱,我火速辦了婚禮趾断,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吩愧。我一直安慰自己芋酌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布雁佳。 她就那樣靜靜地躺著脐帝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糖权。 梳的紋絲不亂的頭發(fā)上堵腹,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音星澳,去河邊找鬼疚顷。 笑死,一個胖子當(dāng)著我的面吹牛禁偎,可吹牛的內(nèi)容都是我干的腿堤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼如暖,長吁一口氣:“原來是場噩夢啊……” “哼笆檀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盒至,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酗洒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后枷遂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樱衷,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年酒唉,在試婚紗的時候發(fā)現(xiàn)自己被綠了矩桂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡黔州,死狀恐怖耍鬓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情流妻,我是刑警寧澤牲蜀,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站绅这,受9級特大地震影響涣达,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一度苔、第九天 我趴在偏房一處隱蔽的房頂上張望匆篓。 院中可真熱鬧,春花似錦寇窑、人聲如沸鸦概。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窗市。三九已至,卻和暖如春饮笛,著一層夾襖步出監(jiān)牢的瞬間咨察,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工福青, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摄狱,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓无午,卻偏偏與公主長得像媒役,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子指厌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 人生苦多刊愚,快來 Kotlin ,快速學(xué)習(xí)Kotlin踩验! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,209評論 9 118
  • 307商玫、setValue:forKey和setObject:forKey的區(qū)別是什么箕憾? 答:1, setObjec...
    AlanGe閱讀 1,547評論 0 1
  • 你還好嗎袭异? 我很好。 洗完澡炬藤,來張面膜御铃,依偎在床上,窗外的風(fēng)聲似乎有些寒冷沈矿,打開筆記本看看今天的熱點(diǎn)上真,此時此刻,我...
    遇見安琪閱讀 256評論 1 3
  • 自己摸索中的小作品羹膳,請多多指教啦
    檸檬汁_824閱讀 165評論 0 0
  • (1):朝鮮為什么敢打美國睡互?神回復(fù):因?yàn)樗麄冨X不在美國,老婆不在美國,孩子也不在美國就珠。 (2):美國為什么不敢打朝...
    古墓道人閱讀 2,946評論 0 0