2012-11-12 19 views
31

bodyにデータと_idが含まれているという要求がありますMongoose.js:作成または更新を実装する方法は?

_idのレコードが存在し、誰も存在しない場合に更新するコードを実装するにはどうすればよいでしょうか?私のコード:

var obj = req.body; 
Model.findById(obj._id, function(err, data){ 
    if (!data){ 
     var model = new Model(obj) 
     model.save(function(err, data){ 
      res.send({method: 'create', error: err, data: data}) 
     }) 
    } else { 
     Model.findByIdAndUpdate(obj._id, obj, function(){ 
      res.send({method: 'update', error: err, data: data}) 
     }) 
    } 

私はちょうどこれを行うのより良い方法が考えています。

答えて

59

あなたは、単一のupsertでそれを行うことができます。

var obj = req.body; 
var id = obj._id; 
delete obj._id; 
if (id) { 
    Model.update({_id: id}, obj, {upsert: true}, function (err) {...}); 
} 

注意点は、モデルのデフォルトおよびミドルウェアが(もしあれば)が適用されないことです。

マングース4.xのアップデート

アップサートは、新しい文書を作成する場合は、今もデフォルトを適用するにはsetDefaultOnInsertオプションを使用することができます。

Model.update({_id: id}, obj, {upsert: true, setDefaultsOnInsert: true}, cb); 
+0

問題は「OBJ」_idが含まれていることで、更新の場合、私はそれを前に更新プログラムを削除する必要があるか、私はエラー – WHITECOLOR

+1

@WHITECOLOR良い点「は許されない_id上のMod」を取得します。 'update'の前に削除するようにコードを更新しました。 – JohnnyHK

+0

こするがあります。私は新しく作成された(存在しない場合)Itemがobj._idと等しい_idを持つようにしたい、作成操作の前にobjから_idを削除する場合、mongoは新しい_idを作成します。 – WHITECOLOR

関連する問題