$set
定义
$set
$set
操作符会用指定值替换某个字段的值。
兼容性
可以使用 $set
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$set
操作符表达式的形式如下:
{ $set: { <field1>: <value1>, ... } }
要在嵌入式文档或数组中指定 <field>
,请使用点符号。
行为
从 MongoDB 5.0 开始,更新操作符按字典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。详情请参阅更新操作符行为。
如果该字段不存在,$set
则会添加一个具有指定值的新字段,但前提是新字段不违反类型限制。如果为不存在的字段指定虚线路径,则 $set
将根据需要创建嵌入式文档,以满足该字段的虚线路径。
如果指定多个字段值对,$set
将更新或创建每个字段。
从 MongoDB 5.0 开始,使用带空操作数表达式 ({ }
) 的更新操作符(如 $set
)时,mongod
不会再引发错误。空更新不会导致任何变化,也不会创建 oplog 条目(意味着该操作为“无操作”)。
示例
创建 products
集合:
db.products.insertOne( { _id: 100, quantity: 250, instock: true, reorder: false, details: { model: "14QQ", make: "Clothes Corp" }, tags: [ "apparel", "clothing" ], ratings: [ { by: "Customer007", rating: 4 } ] } )
设置顶级字段
对于与 _id
条件等于 100
相匹配的文档,以下操作会使用 $set
运算符来更新 quantity
、details
和 tags
字段的值。
db.products.updateOne( { _id: 100 }, { $set: { quantity: 500, details: { model: "2600", make: "Fashionaires" }, tags: [ "coats", "outerwear", "clothing" ] } } )
此操作会更新以下内容:
将
quantity
的值更新为500
details
字段,带有新嵌入文档tags
字段,带有新数组
{ _id: 100, quantity: 500, instock: true, reorder: false, details: { model: '2600', make: 'Fashionaires' }, tags: [ 'coats', 'outerwear', 'clothing' ], ratings: [ { by: 'Customer007', rating: 4 } ] }
在嵌入式文档中设置字段
要在嵌入式文档或数组中指定 <field>
,请使用点符号。
对于与 _id
条件等于 100
相匹配的文档,以下操作会更新 details
文档中的 make
字段:
db.products.updateOne( { _id: 100 }, { $set: { "details.make": "Kustom Kidz" } } )
更新后,此文档具有以下值:
{ _id: 100, quantity: 500, instock: true, reorder: false, details: { model: '2600', make: 'Kustom Kidz' }, tags: [ 'coats', 'outerwear', 'clothing' ], ratings: [ { by: 'Customer007', rating: 4 } ] }
重要
上述代码使用 dot notation
更新嵌入式 details
文档的 make
字段。代码格式看起来与以下代码示例类似,但该示例替换整个嵌入式文档,从而删除嵌入式 details
文档中的所有其他字段:
db.products.updateOne( { _id: 100 }, { $set: { details: {make: "Kustom Kidz"} } })
在数组中设置元素
要在嵌入式文档或数组中指定 <field>
,请使用点符号。
对于与 _id
条件等于 100
相匹配的文档,以下操作会更新 ratings
数组中 tags
字段内第二个元素(1
的数组索引)的值,以及第一个元素(0
的数组索引)内 rating
字段的值。
db.products.updateOne( { _id: 100 }, { $set: { "tags.1": "rain gear", "ratings.0.rating": 2 } } )
更新后,此文档具有以下值:
{ _id: 100, quantity: 500, instock: true, reorder: false, details: { model: '2600', make: 'Kustom Kidz' }, tags: [ 'coats', 'rain gear', 'clothing' ], ratings: [ { by: 'Customer007', rating: 2 } ] }
有关数组的其他运算符,请参阅数组更新运算符。