2014-12-19 63 views
1

我對貓鼬的pull方法有些困惑,你只能通過objectID拉取,還是隻需要拉取數據模型中的值?MongoDB - Mongoose Array從文檔中提取

無論哪種方式,我無法得到拉從數組中刪除元素。

下面是型號:

var fieldSchema = new Schema({ 
    'name' : String, 
    'value' : String 
}); 

var formSchema = new Schema({ 
    'name' : String, 
    'fields' : [fieldSchema] 
}); 

var userSchema = new Schema({ 
    'email' : String, 
    'firstName' : String, 
    'lastName' : String, 
    'application' : [formSchema] 
}); 

var fieldModel = mongoose.model('field',fieldSchema); 
var formModel = mongoose.model('form',formSchema); 
var userModel = mongoose.model('user',userSchema); 

代碼(存在這就是爲什麼findOne沒有paramters數據庫只有一個DOC):

userModel.findOne({}, function (err, user) { 
    if (err) return handleError(err); 

    var edit = false; 

    for(i in user.application) { 
    if(user.application[i].name == submit.name) { 
     edit = true; 

     user.application.pull({'name':submit.name}); //is this valid? 
     user.application.push(submit); 
    } 
    } 
    console.log(edit); 
    if(!edit) { 
    user.application.push(submit); 
    } 

    user.save(function(err, doc, numAffected) { 
    if (err) console.log(err); 
    else { 
     console.log('number of rows: ' + numAffected); 
     doc.save(); 
    } 
    }); 

}); 

文件在DB:

"_id" : ObjectId("5490f0cdd059b4cdb6bdf7d2"), 
"email":"[email protected]", 
"firstName":"tester", 
"lastName":"tester", 
"application" : [ 
    { 
     "name" : "Contact", 
     "fields" : [ 
      { 
       "field_name" : "New field - 1", 
       "field_value" : "kkkkkkk" 
      } 
     ] 
    } 
], 

回答

1

用下面的代碼改變你的第二個代碼,你使用的拉是不允許的,因爲user.application是javascrip牛逼陣列,也沒有拉法從陣列。你可以在MongoDB中查詢使用$拉刪除元素,它是不推薦使用for(i in user.application)在這種情況下 太

userModel.update({'application.name':submit.name},{$push:{application:submit}},function (err, user) { 
    if(user===0){ 
    userModel.update({},{$push:{application:submit}},function(){ 

    }) 
    } 

}); 
+0

爲什麼不建議使用for循環在這個情況下? – rajh2504

+1

,因爲你有數組user.application和使用循環迭代通過,但在同一時間你推入數組中的對象(user.application),因爲它執行多個: 使用此代碼並記錄循環多少次執行: var j = 0; (用戶應用程序中的var i) { console.log(++ j) if(user.application [i] .name == submit.name){ edit = true; user.application.pull({'name':submit.name}); user.application.push(submit); //錯誤! } } – kaxi1993

+0

啊,謝謝你好趕! – rajh2504