$setOnInsert
定义
$setOnInsert
如果使用 upsert: 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
操作。