69

我有一个请求,其中正文包含数据和 _id

如果存在带有 _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})
        })
    }

我只是在想也许有更好的方法来做到这一点。

4

1 回答 1

112

你可以用一个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 更新

如果 upsert 创建了一个新文档,您现在可以使用该setDefaultOnInsert选项来应用默认值。

Model.update({_id: id}, obj, {upsert: true, setDefaultsOnInsert: true}, cb);
于 2012-11-12T05:23:29.333 回答