2016-02-22 3 views
0

Я относительно новичок в Mongoose, и у меня возникли проблемы с работой doc.save() при обновлении поддокумента.Обновление поддокументов с помощью doc.save Mongoose()

В настоящее время у меня есть этот код:

Marksheet.findById(req.body.id, function(err, marksheet) { 
     if (err) return res.send(err); 
     marksheet.marks[0] = req.body.mark; 
     marksheet.save(function(err){ 
      if (err) return res.send(err); 
      res.json(marksheet); 
     }); 

Когда я запускаю это через Node.js я получаю эту ошибку:

TypeError: doc.save is not a function

Если я пытаюсь изменить только некоторые из корневых значений, I не имеют проблем с запуском markheet.save(). Кроме того, если я использую findByIdAndUpdate(), то, похоже, он работает нормально.

Marksheet.findByIdAndUpdate(marksheet._id, marksheet, {new: true}, function(err, newMarksheet){ 
      if (err) return res.send(err); 
      res.json(newMarksheet); 
     }); 

Мой вопрос почему поддокумент не хочет, чтобы сохранить и есть лучший способ для меня, чтобы запустить эту операцию обновления, а не заменять весь документ?

ответ

0

Вы можете использовать метод .save() при создании нового объекта модели и используя метод findOne(). вы можете увидеть в приведенном ниже примере:

Chat.findOne({idChatGroup : idChatGroup}, function(err,chat){ 
      if(err){ 
       res.json({ 
        status : "not_ok", 
        result : "Error Query" 
       }) 
      }else{ 
       if(chat){ 
        var chatSave = new Chat({ 
         idChatGroup : idChatGroup, 
         children : [{ 
          uidUser : uidUser, 
          gcmID : gcmID 
         }] 
        }); 

        chatSave.save(function (err,result){ 
         if(err){ 
          res.json({ 
           status : "not_ok", 
           result : "Error Saving user" 
          }); 
         }else{ 
          res.json({ 
           status : "ok", 
           result : "user add to group" 
          }); 
         } 
        }); 
       }else{ 
        chat.children.push({ 
         uidUser : uidUser, 
         gcmID : gcmID 
        }); 

        chat.save(function (err,result){ 
         if(err){ 
          res.json({ 
           status : "not_ok", 
           result : "Error Saving user" 
          }); 
         }else{ 
          res.json({ 
           status : "ok", 
           result : "user add to group" 
          }); 
         } 
        }); 
       } 




      } 

так, когда вы пытаетесь обновить поддокумент, вам нужно найти документ первой, а затем обновить поддокумент.

Вы можете найти полный исходный here

+0

Это именно то, что я написал в моем вопросе, как мой текущий обходной путь. findOneAndUpdate - это то же самое, что и findByIdAndUpdate. Я спрашивал, есть ли способ использовать метод doc.save()? – StefanM

+0

см. Обновленный ответ спасибо –