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.
 
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号