mongoose.js:如何实现创建或更新?

3j86kqsm  于 11个月前  发布在  Go
关注(0)|答案(3)|浏览(81)

我有一个请求,请求体包含data和_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})
        })
    }

字符串
我在想也许有更好的办法。

7dl7o3gd

7dl7o3gd1#

你可以用一个upsert来做到这一点:

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

字符串
需要注意的是,您的模型的默认值和中间件(如果有的话)将不会被应用。

Mongoose 4.x更新

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

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

dced5bon

dced5bon2#

var obj = req.body;
 var id = obj._id;
 delete obj._id;
 model.findOneAndUpdate({ _id: id }, obj, {
                     new: true,
                     upsert: true, // Make this update into an upsert
 });

字符串

wgeznvg7

wgeznvg73#

由于update函数在新版本中被弃用,因此updateOnefindOneAndUpdate可以这样使用:

const { _id, ...updateModel } = req.body;

return await Model.updateOne({ _id }, updateModel, { new: true, upsert: true })
    .then(data => res.send({ method: 'create', error: null, data }))
    .catch(error => res.send({ method: 'update', error, data: null }));

字符串

相关问题