2012-11-12 45 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

相关问题