2012-11-12 67 views
31

我有一個請求哪個正文包含數據和_idMongoose.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選項也適用默認如果UPSERT創建一個新文檔。

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

的問題是,「目標文件」包含_id,並在更新的情況下,我需要將其刪除之前更新或我得到「國防部對_id不得入內」的錯誤 – WHITECOLOR

+1

@WHITECOLOR好一點。更新代碼以刪除'update'前的代碼。 – JohnnyHK

+0

有蹭。我希望新創建(如果它不存在)Item使_id等於obj._id,如果在創建操作之前從obj中刪除_id,mongo將創建新的_id。 – WHITECOLOR

相關問題