$set
定义
$set
$set
运算符用指定值替换字段的值。
兼容性
您可以在以下环境中使用$set
MongoDB Atlas:云中MongoDB部署的全托管服务
MongoDB 企业版:基于订阅、自行管理的 MongoDB 版本
MongoDB 社区版:源代码可用的、免费使用且可自行管理的 MongoDB 版本
语法
$set
操作符表达式具有以下形式
{ $set: { <field1>: <value1>, ... } }
要指定嵌入式文档或数组中的 <field>
,请使用 点表示法。
行为
从 MongoDB 5.0 开始,更新操作符按照基于字符串的名称的字典顺序处理文档字段。具有数字名称的字段按数字顺序处理。有关详细信息,请参阅 更新操作符行为。
如果字段不存在,$set
将添加一个具有指定值的新字段,前提是新字段不违反类型约束。如果您指定了一个不存在字段的点路径,$set
将根据需要创建嵌入式文档以实现到字段的点路径。
如果您指定了多个字段值对,$set
将更新或创建每个字段。
从 MongoDB 5.0 开始,mongod
在使用类似 $set
的更新操作符且操作数表达式为空({ }
)时不再引发错误。空更新不会引起更改,并且不会创建任何 操作日志 条目(意味着该操作是 no-op)。
示例
创建 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 } ] }
重要
上述代码使用 点表示法
更新内嵌的 details
文档的 make
字段。代码格式类似于以下代码示例,该示例将 替换整个内嵌文档,移除内嵌 details
文档中的所有其他字段
db.products.updateOne( { _id: 100 }, { $set: { details: {make: "Kustom Kidz"} } })
设置数组中的元素
要指定嵌入式文档或数组中的 <field>
,请使用 点表示法。
对于匹配以下条件的文档 _id
等于 100
,以下操作更新了 tags
字段中第二个元素(数组索引为 1
)和 ratings
数组中第一个元素(数组索引为 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 } ] }
有关数组的其他更新运算符,请参阅 数组更新运算符。