2014-12-19 4 views
1

Я немного запутался в методе pull из mongoose, вы можете просто потянуть объектID, или же тяга просто должна быть по величине из модели данных?MongoDB - Mongoose Array Pull from doc

В любом случае я не могу получить тяну, чтобы удалить элементы из массива.

Вот модели:

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

Code (есть только один документ в БД, который почему findOne не имеет paramters):

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

}); 

Doc в БД:

"_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 является javascript ar Рентгенологическое и нет никакого способа вытащить, чтобы удалить элемент из массива .Вы можете использовать $ тянуть в 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

Почему не рекомендуется использовать цикл в эта ситуация? – rajh2504

+1

, потому что у вас есть массив user.application и используйте для цикла для итерации, но в то же время вы нажимаете объект в массиве (user.application), из-за этого он выполняет более одного: используйте этот код и регистрируйте, сколько раз для цикла выполняет: var j = 0; для (var i in user.application) { 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