zoukankan      html  css  js  c++  java
  • mongodb-4.4.10版本update进阶

    本文主要介绍update,对增删改查其他操作感兴趣的请查看我的其他博文:

    mongodb-4.4.10版本与MySQL的SQL语法对比,以及mongodb增删改查入门demo

    mongodb-4.4.10版本SQL查询进阶,mongodb与mysql的select SQL大比拼

    update选择器:

    运算符类型 运算符 描述
    操作符 $inc 指定值加n
    $set 更新指定字段
    $unset 将指定字段删除
    $rename 更新字段名称
    数组操作符 $ 定位到某一个元素
    $push 添加值到数组中
    $addToSet 添加值到数组中,有重复则不处理
    $pop 删除数组第一个或者最后一个
    $pull 从数组中删除匹配查询条件的值
    $pullAll 从数组中删除多个值
    数组运算修饰符 $each 与$push和$addToSet等一起使用来操作多个值
    $slice 与$push和$each一起使用来操作用来缩小更新后数组的大小
    $sort 与$push、$each、$slice一起使用来对数组进行排序

    mongo的update语法参数说明:

    db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )

    参数说明:

    query : update的查询条件,类似sql update查询内where后面的;

    update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的

    upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入,true为插入,默认是false,不插入。

    multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

    writeConcern :可选,写策略配置。

    假设有这样一些文档:

    {
        "id": 1,
        "username": "ZhangSan",
        "money":150.88,
        "age":20,
        "birthday": "2011-11-26",
        "createTime":"2020-05-15 10:00:00",
        "updateTime":"2011-11-26 12:26:21",
        "address": {
             "code":"411000"
            "adress_detail":"长沙"
        },
        "favorites": {
            "movies":["蜘蛛侠","钢铁侠","蝙蝠侠"],
            "cites":["北京","杭州","上海"]
        },
        "comments":[
          {"author":"lisi","content":"第1楼评论内容","commentTime":ISODate("2017-06-06T10:15:22.00Z")},
          {"author":"wangwu","content":"第2楼评论内容","commentTime":ISODate("2017-06-07T12:16:11.00Z")},
          {"author":"liuliu","content":"第3楼评论内容","commentTime":ISODate("2017-06-08T13:17:20.00Z")},
        ]
    }
      mongo MySQL
    update 1 db.users.update({"username":"cang"},{"$set":{"age":18}},{"upsert":true})
    这里的upsert值如果不存在update的记录,是否插入。true为插入,默认是false不插入。
    update users set age = 18 where username = 'cang'
    update 2 db.users.updateMany({"username":"lison"},{"$unset":{"country":"","age":""}})
    删除country和age两个字段
     
    update 3 db.users.updateMany({"username":"lison"},{"$rename":{"lenght":"height", "username":"name"}})
    某个文档的某些字段重新命名
    alter table .... 整张表
    update 4 db.users.updateMany({ "username":"cang"},{"$addToSet":{"favorites.movies":"赎罪"}})
    追加单个值,之后数据就变成了:
    "favorites": {   "movies":["蜘蛛侠","钢铁侠","蝙蝠侠","赎罪"]  }
     
    update 5 db.users.updateMany({ "username":"cang"},{"$addToSet":{"favorites.movies":  {"$each":["珍珠港","美丽人生"]}    }})
    追加多个值,之后数据变成了:
    "favorites": {   "movies":["蜘蛛侠","钢铁侠","蝙蝠侠","赎罪","珍珠港","美丽人生"]  }
     
    delete 1

    db.users.updateMany({ "username":"cang"},  {"$pull":{"favorites.movies": "蜘蛛侠"}}   )
    删除单个值,之后数据变成了:
    "favorites": {   "movies":["钢铁侠","蝙蝠侠","赎罪","珍珠港","美丽人生"]  }

    db.users.updateMany({ "username":"cang"},{"$pull":{"favorites.movies": ["钢琴家","困在时间里的父亲"]  }})
    删除单个数组,删除之前的数据是:
    "favorites": {   "movies":["钢铁侠","蝙蝠侠","赎罪","珍珠港","美丽人生",   ["钢琴家","困在时间里的父亲"]   ]  }
    删除之后数据变成了:
    "favorites": {   "movies":["钢铁侠","蝙蝠侠","赎罪","珍珠港","美丽人生"]  }

    db.users.updateMany({ "username":"cang"},{"$pullAll":{"favorites.movies2": ["value1","value2"]  }})
    用$pullAll也可以达到一样的效果
     
      db.users.updateOne({"username":"james"},
        {"$push":
             {"comments":
                 {"author":"lison23","content":"yyyytttt","commentTime":ISODate("2019-01-06T00:00:00")}
             }
         }
    )    追加一条评论到数组最后

    db.users.updateOne({"username":"james"}, 
          {"$push": 
                {"comments":
                     {
                          "$each":[ 
                              {"author":"lison22","content":"yyyytttt","commentTime":ISODate("2019-04-06T00:00:00")},
                              {"author":"lison23","content":"ydddyyytttt","commentTime":ISODate("2019-05-06T00:00:00")} 
                           ], 
                          "$sort": {"commentTime":-1} 
                     }
                 } 
           } 
     )
       $each是说把each里面的每一条都追加上,$sort是说追加后再按照commentTime字段降序排列一下
     
      db.fam.findAndModify({query:{name:'morris1'}, update:{$inc:{age:1}},  'new':true});
    这个findAndModify方法的特别之处在于,new这个值如果是true,则返回更新后的文档,如果是false,则返回更新前的文档旧值。
     

    备注:

    1.mongodb的更新都是原子的,mongodb所有的写操作都是有锁的。mongoDB 2.2之前锁级别为实例级别,mongoDB 2.2到3.2之前的版本锁级别为数据库级别,mongoDB 3.2以后,WiredTiger的锁级别是文档级别;

    2.findAndModify命令:在同一往返过程中原子更新文档并返回它;

    3. 注意:mongodb里的事务必须是在mongodb的集群模式里才支持。

    end.

    支付宝扫一扫,为女程序员打赏!
    作者:梦幻朵颜
    版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    MT【305】丹德林双球
    MT【304】反射路径长度比
    MT【303】估计
    MT【302】利用值域宽度求范围
    MT【301】值域宽度
    MT【300】余弦的三倍角公式
    MT【299】对数型数列不等式
    MT【298】双参数非齐次
    xadmin 自定义actions
    xadmin 添加自定义权限
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/15489452.html
Copyright © 2011-2022 走看看