Definition
$setOnInsertIf an update operation with upsert: true results in an insert of a document, then
$setOnInsertassigns the specified values to the fields in the document. If the update operation does not result in an insert,$setOnInsertdoes nothing.You can specify the
upsertoption for either thedb.collection.update()ordb.collection.findAndModify()methods.db.collection.update( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true } ) To specify a
<field>in an embedded document or in an array, use dot notation.
Behavior
In MongoDB 4.4 and earlier, update operators process document fields in lexicographic order. See Update Operators Behavior for details.
Example
A collection named products contains no documents.
Then, the following db.collection.update() with upsert:
true inserts a new document.
db.products.update( { _id: 1 }, { $set: { item: "apple" }, $setOnInsert: { defaultQty: 100 } }, { upsert: true } )
MongoDB creates a new document with _id equal to 1 from the
<query> condition, and then applies the $set and
$setOnInsert operations to this document.
The products collection contains the newly-inserted document:
{ "_id" : 1, "item" : "apple", "defaultQty" : 100 }
If the db.collection.update() with upsert: true had found a matching document, then MongoDB
performs an update, applying the $set operation but ignoring
the $setOnInsert operation.