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.