MongoDB 最常用的数据更新方法$set,你用对了吗?

学习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
    }}
    )

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

威赞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值