2017-03-15 1 views
1

複数のフィールドを持つスキーマがあるとします。文書が私の照会と一致する場合にのみONEフィールドを更新したいと思います。ただし、そうでない場合は、すべてのフィールドの値を含む新しい文書を作成したいと考えています。これにはModel.findOneAndUpdateを使用する方法はありますか?ここでマングースアップデート* ONE *フィールドが見つからない場合すべてのフィールドで新規作成

は、より具体性のためのコードであり、私が試したもの:

は、上記のコードは正しく field1を更新
var mg = require('mongoose'); 
var Record = mg.model ("record", { 
    field1: Number, 
    field2: Number, 
    field3: Number, 
}); 

//Update field1 ONLY if found using findOneAndUpdate, else create with all fields 
var query = {//My Query}, 
    update = {field1: 10}, 
    options = {upsert: true, new: true, setDefaultsOnInsert: true}; 

Record.findOneAndUpdate(query, update, options, function(err,result){ 
    //Do stuff with doc 
}); 

、ないドキュメントはクエリにマッチしていない場合、新しい文書がfield2またはfield3

答えて

0
なしで作成されました

ああ、私はupsertのドキュメントを読んで、私が必要としていたのは私のupdateオブジェクトに更新演算子を入れて、$setOnInsertを使っていたことに気付きました。名前が示すように、この演算子に関連付けられた値は、新しい文書が挿入されている場合にのみ設定されます。したがって、質問の固定コード

var mg = require('mongoose'); 
var Record = mg.model ("record", { 
    field1: Number, 
    field2: Number, 
    field3: Number, 
}); 

//Update field1 ONLY if found using findOneAndUpdate, else create with all fields 
var query = {//My Query}, 
    update = { 
     $set:{field1: 10}, 
     $setOnInsert:{field2: ..., field3: ...} 
    }, 
    options = {upsert: true, new: true, setDefaultsOnInsert: true}; 

Record.findOneAndUpdate(query, update, options, function(err,result){ 
    //Do stuff with doc 
}); 
関連する問題