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文檔表示對(duì)存儲(chǔ)在MongoDB中的文檔的一對(duì)一映射。每個(gè)文檔都是其模型的實(shí)例。

Updating

有多種方式可以更新文檔。我們首先來(lái)看一個(gè)使用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ā)出更新命令(通過(guò)調(diào)用save觸發(fā))。但是,如果我們不需要在我們的應(yīng)用程序中返回的文檔,并且只想直接更新數(shù)據(jù)庫(kù)中的屬性,那么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(){
  //這里不返回文檔
    });

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

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ú)保存,它們?cè)诒4骓敿?jí)父文檔時(shí)保存。

 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ā)生錯(cuò)誤,它會(huì)冒泡到父對(duì)象的save()回調(diào),因此錯(cuò)誤處理是一個(gè)快速!

 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

每個(gè)文檔都有一個(gè)_id。 DocumentArrays有一個(gè)特殊的id方法,通過(guò)其_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)換為其正確類型:

 // 一次性存五個(gè)名字    
 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

每個(gè)子文檔都有自己的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('刪除成功');
        })
    });

如果你不需要訪問(wèn)子文檔模式實(shí)例,那么你也可以通過(guò)傳遞一個(gè)對(duì)象來(lái)聲明sub-docs

let parentSchema = new Schema({ 
    children: [{ name: 'string' }]
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容