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

あなたは単一のアップサートでそれを行うことができます:

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);
于 2012-11-12T05:23:29.333 に答える