定義
$setOnInsertupsert: true を使用したアップデート操作の結果、ドキュメントが挿入された場合、
$setOnInsertは指定された値をドキュメント内のフィールドに割り当てます。アップデート操作の結果が挿入にならない場合、$setOnInsertは何も行いません。次の
upsertオプションを指定できます。db.collection.updateOne( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true } ) <field>を埋め込みドキュメントまたは配列で指定するには、ドット表記を使用します。
動作
MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。
MongoDB 5.0 以降、$setOnInsertなどの更新演算子を空のオペランド式({ })と併用しても、mongod でエラーが発生しなくなりました。空の更新を使用すると変更は一切されず、oplog エントリも作成されません(操作は実行されません)。
例
products コレクションにはドキュメントが含まれていません。
db.collection.updateOne() upsert: true パラメーターを使用して新しいドキュメントを挿入します。
db.products.updateOne( { _id: 1 }, { $set: { item: "apple" }, $setOnInsert: { defaultQty: 100 } }, { upsert: true } )
MongoDB は<query>を使用して_id: 1の新しいドキュメントを作成します。 $setOnInsertは指定されたようにドキュメントを更新します。
products コレクションには新しく挿入されたドキュメントが含まれています:
{ "_id" : 1, "item" : "apple", "defaultQty" : 100 }
upsert パラメーターがtrue db.collection.updateOne()の場合:
が新しいドキュメントを作成します
が
$set操作を適用しますは
$setOnInsert操作を適用します
db.collection.updateOne() が既存のドキュメントと一致する場合、MongoDB は$set 操作のみを適用します。