2014-11-28 4 views
0

У меня есть следующие схемы:обновление встроенного суб документы - Mongoose

var reviewSchema = new mongoose.Schema({ 
comments  : String, 
rating  : String, 
submitted_date: {type: Date, default: Date.now}, 
numAgreed : Number, 
numDisagreed : Number 
}); 

var userSchema = new mongoose.Schema({ 
    firstName : String, 
    lastName  : String, 
    numRatings : Number, 
    averageRating: Number, 
    reviews  : [reviewSchema] 
}); 

Я реализую к соглаше функции (приращение числа тех, кто согласился с обзором) для каждого обзора следующим образом:

exports.processAgree = function(req,res){ 
var firstName = req.body.firstName; 
var lastName = req.body.lastName; 
var index = req.body.index; 

User.findOne({firstName:firstName,lastName:lastName}).lean().exec(function(err,user) { 
    if (err) { 
     throw err; 
    } 
    else{ 
     user.reviews[index].numAgreed++; 

     user.markModified('reviews'); 

     user.save(function (err) { 
      if (err) throw err; 

     }); 

    } 

}); 

};

Однако я получаю ошибку:

reviewedUser.markModified('reviews'); 
        ^
TypeError: Object #<Object> has no method 'markModified' 

Я искал через stackoveflow и видел ответы на этот вопрос, но они не работают в моем случае. Например. Был получен ответ на вопрос: How to update an embedded document within an embedded document in mongoose?

Решение предлагает объявить дочерние схемы перед родительскими схемами, что имеет место в моей ситуации.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Спасибо.

+1

Удалите 'lean()' из цепочки вызовов 'findOne'. Вам нужен полный экземпляр модели, если вы хотите сохранить изменения в документе. – JohnnyHK

ответ

0

Как сказал Джонни, вы должны удалить вызов метода lean в Query.

Такой, что ваш код будет выглядеть

User.findOne({firstName:firstName,lastName:lastName}).exec(function(err,user) { 
    if (err) { 
     throw err; 
    } 
    else{ 
     user.reviews[index].numAgreed++; 

     user.markModified('reviews'); 

     user.save(function (err) { 
      if (err) throw err; 
     }); 
    } 
}); 

Lean используется, чтобы лишить все методы обслуживания и свойства от объектов, которые приходят из методов Mongoose. Если вы не используете метод lean объекта Query, Mongoose вернет экземпляры модели. Mongoose doc on lean().

И markModified метод, который вы ищете, находится в экземпляре модели Mongoose. Кстати, save также находится в экземпляре модели.

Смежные вопросы