2014-11-11 5 views
1

Я хочу использовать проверку в моей схеме. Поэтому я не могу использовать findOneAndUpdate (?). Я должен использовать save.Используя findOne, затем save(), чтобы заменить документ, mongoose

Проблема заключается в том, что если я использую findOne, то заменяет объект тем, который я собираюсь заменить, он больше не будет иметь функцию сохранения.

mongoose.model('calculations').findOne({calcId:req.params['calcId']}, function(err, calculation){ 
    if(err) {errHandler.serverErr(err, res, 'Something went wrong when trying to update a calculation'); return;} 
    calculation = calculationToReplace; 
    calculation.save(function(err, calc){ //No longer exists 
     if(err) {errHandler.serverErr(err, res, 'Something went wrong when trying to update a calculation'); return;} 
     res.send(200); 
    }); 
    }); 

Это должна быть общая задача, но я не могу найти решение. Как это исправить?

+0

В английском языке вы подразумеваете, что вы «читаете» объект из базы данных, но затем объект может «изменяться» в базе данных, прежде чем вы его запишете. Так что это должно объяснить, почему вы этого не делаете и переместите логику в '.findOneAndUpdate()' вместо этого, не так ли? КСТАТИ. Два худших ответа, которые когда-либо возникали –

ответ

4

Существует простое решение вашего (по-настоящему действительно старого) вопроса. В моем случае у меня должен был быть upOrder findOneAndUpdate, который возвращал больше информации о том, что произошло. Поэтому мое решение состояло в том, чтобы пройти процесс, чтобы обновить объект с помощью цикла for.

(Подумайте, почему вы не можете просто скопировать то, что объект doc содержит кучу «дополнительных», таких как информация о версии и функция сохранения и другие «биты»); Итак, вот мое решение.

exports.postData = function(req,res) { 
    console.log("will create " + req.body.alias); 
    console.log("It is level " + req.body.level);  //OK, all this have to be changed to members of the data! req.body contains all the data sent from the user at this time 
    var query = { 'fulltext' : req.body.fulltext}; 
    console.log("Checkking if " + req.body.fulltext + " exists") 
    Skill.findOne(query, function (err,doc){ 
     if(err) return res.status(500).send(err) 
     if (!doc){ 
      console.log(req.body.fulltext + " not found!") 
      var newdoc = new Skill(req.body); 
      newdoc.save(function(err){ 
       if(err) return res.status(500).send(err) 
       console.log(newdoc.fulltext + " created as " + newdoc._id); 
       return res.status(200).send({_id: newdoc._id, alias: newdoc.alias}) 
      }) 

      return res.status(200).send('blal') 
     } else { 
      console.log(req.body.fulltext + " found!") 
      for (var id in req.body){ 
       doc[id]= req.body[id]; 
      } 
      doc.save(function(err){ 
       if(err) return res.status(500).send(err) 
       return res.status(200).send({_id: doc._id, alias: doc.alias}) 
      }) 


      //return res.status(200).send({_id: doc._id, alias: doc.alias}) 
     } 
0

Да, есть способ. Вы можете прочитать документацию по mongoose here. Взгляните на следующий код.

Tank.findById(id, function (err, tank) { 
    if (err) return handleError(err); 

    tank.size = 'large'; 
    tank.save(function (err) { 
    if (err) return handleError(err); 
    res.send(tank); 
    }); 
}); 

Этот подход включает в себя первый retreiving документ из Монго, а затем выдавать команду обновления (запускается вызовом сохранения).

+0

Но я хочу заменить весь объект. Не только одно свойство. – Per

+0

@ PerStröm Вы должны присвоить все свойства индивидуально указанным выше способом. Вы не можете просто заменить весь объект. –

+0

@techxxx Итак, я должен написать 50-60 объектов индивидуально? Должен быть лучшим способом. – Per

0

Я не проверял следующее, так что я не уверен, если это работает должным образом, но это, вероятно, следует хорошо:

Своп это:

calculation = calculationToReplace; 

с этим:

for (var key in calculationToReplace) 
    if(typeof calculation[key] !== 'function') 
    calculation[key] = calculationToReplace[key]; 
+1

Нехороший из меня, чтобы поставить критику на другого ответчика, не указывая, насколько это ужасно неправильно. Он в основном открыт для перезаписи любых обновлений, которые произошли между ними. –

+0

@NeilLunn Если у вас есть лучший ответ, поделитесь им, и я одобрю его, если найду его лучше. – Per

+0

Неправильный подход или не устраняет проблему, с которой этот вопрос был создан для: «у него больше не будет функции сохранения». Сообщите нам правильный подход, который вы рекомендуете – AngelKyriako

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