mongoose學(xué)習(xí)筆記4之Documents

假設(shè)以下代碼都運(yùn)行在

let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
let db = mongoose.connection;
db.on('error', () => {
  console.error('鏈接失敗');
});
db.once('open', function () {
  //下面講到的所有代碼都在這里運(yùn)行
});

Documents

Mongoose文檔表示對存儲在MongoDB中的文檔的一對一映射。每個文檔都是其模型的實例挡逼。

Updating

有多種方式可以更新文檔玖喘。我們首先來看一個使用findById的傳統(tǒng)方法:

 let Schema = mongoose.Schema;
    let schema = new Schema({
        name:String
    });
    let Person = mongoose.model('Person',schema);
Person.findById("5879c65893963d18fe77a31b",function(err,man){
        if(err){
          return  console.error(err);
        }
        man.name = 'Blu';
        man.save(function(err){
            if(err){
               return console.error(err);
            }
            console.log('保存成功');
        });
    });

這種方法包括首先從Mongo中檢索文檔咙轩,然后發(fā)出更新命令(通過調(diào)用save觸發(fā))券躁。但是艰毒,如果我們不需要在我們的應(yīng)用程序中返回的文檔,并且只想直接更新數(shù)據(jù)庫中的屬性占婉,那么Model#update適合我們:

  let Schema = mongoose.Schema;
  let schema = new Schema({
        name:String
  });
  let Person = mongoose.model('Person',schema);
  Person.update({_id:"5879c65893963d18fe77a31b"},{$set:{name:'SHE'}},function(){
  //這里不返回文檔
    });

如果我們確實需要在我們的應(yīng)用程序中返回文檔泡嘴,有另一個更好的選擇:

let Schema = mongoose.Schema;
let schema = new Schema({
        name:String
    });
let Person = mongoose.model('Person',schema);   
 Person.findByIdAndUpdate('5879c65893963d18fe77a31b',{$set:{name:"李尋歡"}},function(err,man){
        if(err){
            return console.error(err);
        }
        console.log(man);
    });

Sub Docs

子文檔是具有自己的模式的文檔,它們是父文檔數(shù)組的元素:

let childSchema = new Schema({ name: 'string' });
let parentSchema = new Schema({ children: [childSchema]});

子文檔享有與普通文檔相同的功能逆济。唯一的區(qū)別是它們不單獨(dú)保存酌予,它們在保存頂級父文檔時保存。

 let Schema=  mongoose.Schema;
    let childrenSchema = new Schema({
        name:String
    });
    let parentSchema = new Schema({
        children:[childrenSchema]
    });
    let Parent = mongoose.model('Parent',parentSchema);
    let parent = new Parent({
        children:[{
            name:'Matt'
        },{
            name:'Sarah'
        }]
    });
    parent.save(function(err,parent){
        if(err){
            return console.error(err);
        }
        console.log(parent);
    });

如果在子文檔中間件中發(fā)生錯誤奖慌,它會冒泡到父對象的save()回調(diào)抛虫,因此錯誤處理是一個快速!

 let Schema=  mongoose.Schema;
    let childrenSchema = new Schema({
        name:String
    });
    childrenSchema.pre('save',function(next){
        if('noshower' == this.name){
            return next(new Error(this.name+'禁止取'));
        }
        next();
    });
    let parentSchema = new Schema({
        children:[childrenSchema]
    });
    let Parent = mongoose.model('Parent',parentSchema);
    let parent = new Parent({
        children:[{
            name:'noshwoer'
        },{
            name:'noshower'
        }]
    });
    
    parent.save(function(err,parent){
        if(err){
            return console.error(err); //Error: noshower禁止取
        }
        console.log(parent);
    });

Finding a sub-document

每個文檔都有一個_id简僧。 DocumentArrays有一個特殊的id方法建椰,通過其_id查找文檔。

 let Schema=  mongoose.Schema;
    let childrenSchema = new Schema({
        name:String
    });
    childrenSchema.pre('save',function(next){
        if('noshower' == this.name){
            return next(new Error(this.name+'禁止取'));
        }
        next();
    });
    let parentSchema = new Schema({
        children:[childrenSchema]
    });
    let Parent = mongoose.model('Parent',parentSchema);
//先找到父文檔       Parent.findOne({_id:'5879d25dc3352e1ad7855f65'},function(err,parent){
        if(err){
            return console.error(err);
        }
//查詢子文檔
        let doc =parent.children.id('5879d25dc3352e1ad7855f67');
        console.log(doc.name); //Matt
    });

Adding sub-docs

MongooseArray方法(例如push岛马,unshift棉姐,addToSet和其他方法)將參數(shù)強(qiáng)制轉(zhuǎn)換為其正確類型:

 // 一次性存五個名字    
 let Schema=  mongoose.Schema;
    let childrenSchema = new Schema({
        name:String
    });
    childrenSchema.pre('save',function(next){
        if('noshower' == this.name){
            return next(new Error(this.name+'禁止取'));
        }
        next();
    });
    let parentSchema = new Schema({
        children:[childrenSchema]
    });
    let Parent = mongoose.model('Parent',parentSchema);
    let parent = new Parent();
    let names = ['John','Michelle','Amy','Kim','Mary'];
    for(let val of names){
        parent.children.push({name:val});
    }
    parent.save(function(err,parent){
        if(err){
            return console.error(err);
        }
        console.log('success'); //success
    });

Removing docs

每個子文檔都有自己的remove方法。

 let Schema=  mongoose.Schema;
 let childrenSchema = new Schema({
        name:String
    });
 childrenSchema.pre('save',function(next){
        if('noshower' == this.name){
            return next(new Error(this.name+'禁止取'));
        }
        next();
    });
 let parentSchema = new Schema({
        children:[childrenSchema]
    });
 let Parent = mongoose.model('Parent',parentSchema);
    Parent.findOne({'_id':"5879d25dc3352e1ad7855f65"},function(err,parent){
        parent.children.id('5879d25dc3352e1ad7855f67').remove();
        parent.save(function(err){
            if(err){
              return  console.error(err);
            }
            console.log('刪除成功');
        })
    });

如果你不需要訪問子文檔模式實例啦逆,那么你也可以通過傳遞一個對象來聲明sub-docs

let parentSchema = new Schema({ 
    children: [{ name: 'string' }]
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伞矩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夏志,更是在濱河造成了極大的恐慌乃坤,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侥袜,居然都是意外死亡蝌诡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門枫吧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浦旱,“玉大人,你說我怎么就攤上這事九杂“浜” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵例隆,是天一觀的道長甥捺。 經(jīng)常有香客問我,道長镀层,這世上最難降的妖魔是什么镰禾? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮唱逢,結(jié)果婚禮上吴侦,老公的妹妹穿的比我還像新娘。我一直安慰自己坞古,他們只是感情好备韧,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痪枫,像睡著了一般织堂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奶陈,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天易阳,我揣著相機(jī)與錄音,去河邊找鬼吃粒。 笑死闽烙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的声搁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼捕发,長吁一口氣:“原來是場噩夢啊……” “哼疏旨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扎酷,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤檐涝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谁榜,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幅聘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窃植。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帝蒿。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖巷怜,靈堂內(nèi)的尸體忽然破棺而出葛超,到底是詐尸還是另有隱情,我是刑警寧澤延塑,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布绣张,位于F島的核電站,受9級特大地震影響关带,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宋雏,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一燃箭、第九天 我趴在偏房一處隱蔽的房頂上張望招狸。 院中可真熱鬧裙戏,春花似錦累榜、人聲如沸壹罚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菠红。三九已至试溯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杠纵。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工比藻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留银亲,地道東北人纽匙。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像院喜,于是被迫代替她去往敵國和親晕翠。 傳聞我的和親對象是個殘疾皇子淋肾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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