推荐答案
$setOnInsert
是 MongoDB 中的一个更新操作符,用于在更新操作中插入新文档时设置字段的值。如果更新操作导致插入新文档(即 upsert
为 true
且没有匹配到任何文档),$setOnInsert
会将指定的字段和值添加到新文档中。如果更新操作只是修改现有文档,$setOnInsert
不会对文档进行任何更改。
本题详细解读
使用场景
$setOnInsert
通常用于 upsert
操作中,即当更新操作没有找到匹配的文档时,插入一个新文档。在这种情况下,$setOnInsert
可以确保新插入的文档包含某些默认值或初始值。
语法
db.collection.update( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true } )
示例
假设有一个 users
集合,我们希望更新一个用户的 lastLogin
时间,如果用户不存在,则插入一个新用户并设置 createdAt
字段。
db.users.update( { username: "john_doe" }, { $set: { lastLogin: new Date() }, $setOnInsert: { createdAt: new Date() } }, { upsert: true } )
- 如果
username
为"john_doe"
的用户存在,lastLogin
字段会被更新,createdAt
字段不会被修改。 - 如果
username
为"john_doe"
的用户不存在,MongoDB 会插入一个新文档,包含username
、lastLogin
和createdAt
字段。
注意事项
$setOnInsert
只在插入新文档时生效,不会影响现有文档的更新操作。- 如果
upsert
为false
或未指定,$setOnInsert
不会生效。