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.

posted on 2021-10-31 14:31  梦幻朵颜  阅读(175)  评论(0编辑  收藏  举报