学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第59篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。
本文聊聊Mongodb update中的$set方法。$set是最常用的数据更新方法。使用该方法可以直接修改文档的字段值。也是每一个mongodb操作人员最熟悉的技能。本文阅读整理mongodb的官方文档,给出$set方法的定义,行为,应用举例等。
定义
在UPDATE方法中,使用$set操作符将字段值替换为指定值
语法
按照下面的形式使用$set操作符
{$set : { <field1>: <value1>, ...}}
如
db.products.update({_id: <product_id>}, {$set: {<field1>: <value1>}})
当需要更新的字段是嵌套字段或数组中的字段,需要使用点操作符。
行为
- 自mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
- 当字段不存在时,$set方法向文档中添加字段并将字段值设置为指定值。当使用点操作符指定的字段不存在时,$set操作符按照点操作符的层级关系创建嵌套文档 ,并将字段值设置为指定值。
- 在$set操作符中指定多个键值对时,mongodb会更新或指定每一个字段。
- mongodb 5.0版本以后,向$set传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。
应用
创建集合products, 并插入一条数据。其中details字段是文档类型。tags是字符串数组类型。 ratings是文档数组类型。
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 } ]
})
修改顶级字段
修改quantiy, detals, tags字段的值。其中使用新的对象文档替换details字段,使用新的数组替换 tags数组。
db.products.updateOne(
{ _id: 100},
{ $set: {
quantity: 500,
details: { model: "2600", make: "Fashionaires"},
tags: ["coats", "outerwear", "clothing"]
}}
)
更新嵌套文档字段
使用点操作符,指定嵌入文档或素组中字段的值。
修改details字段中,文档字段make的值。这段代码中,只修改了details字段对象中的make字段值。不会对model字段产生影响。
db.products.updateOne(
{_id: 100},
{ $set: {"details.make": "Kustom Kidz"}}
)
而下面的语句,则将details替换为新的对象,虽然指定的make字段值,但没有model字段,所以文档替换后,只保留了make字段
db.products.updateOne(
{_id: 100},
{ $set: {details : {make:"Kustom Kidz"}}}
)
更新数组字段
使用点操作符和数组位置,更新数组对象的值。
下面语句,将数组tags中第二个元素(数组位置为1,从0开始)更新为“rain gear”, 将rating数组中第一个元素的rating值更新为2
db.products.updateOne(
{ _id: 100},
{ $set: {
"tags.1": "rain gear",
"ratings.0.rating": 2
}}
)