Mongodb学习日志(二):UPDATE及修改器
2015-12-13 20:56
896 查看
学习内容说明:
更新方法参数使用批量更新
修改器的种类及使用
批量更新数组(无重复值)
1. 更新方法
mongo通过update方法进行文档修改db.[文档名称].update( {条件},{修改器 : 更新内容},[true/false], [true/false] )
如:db.person.update( {name : “zhang” }, {$set : {sex : “M”, age : 34}}, true, false)
说明:
1. 修改器是可选的,mongo提供多种修改器,可以选择其中一种或者不选择,如不使用修改器则为强制修改,根据条件查询出的文档将被新文档替换。
2. 第三个参数默认为false,当为true时,其执行方式类似于hibernate的saveOrUpdate,即若有匹配文档时进行更新,若无时则进行插入操作。
3. 第四个参数默认为false,当为true时表示批量修改,为false时只修改匹配的第一条。当批量修改时(参数为true)则需要有一个修改器。
2. 批量更新
设置第三个参数为false,第四个参数为true,并在第二个参数中设置一个修改器。如:
db.person.update({name : “zhang”},{$set : {sex : “M”}} , false, true)
3. 修改器【通过修改器来完成局部更新操作】
修改器名称 | 语法 | 说明 | 示例 |
---|---|---|---|
$set | {$set:{field:value}} | 用于指定一个键值对,存在就修改,不存在就添加 | {$set:{name:”Leon”}} |
$inc | {$inc:{field:value}} | 只适用于数字类型的字段值修改,对指定字段进行增减指定数值 | {$inc:{age:1}} |
$unset | {$unset:{field:1}} | 删除指定的字段 | {$unset:{age:1}} |
$push | {$push:{field:value}} | 指定的字段必须是数组,否则中断,指定的字段不存在则创建 | {$push:{family:”brother”}} |
$pushAll | {$pushAll:{field:array}} | 要求同push,一次添加多个元素到数组 | {$pushAll:{family:[“father”,”mother”,”brother”]}} |
$addToSet | {$addToSet:{field:value}} | 将值插入匹配元素指定的数组中,如果该值已存在则不添加 | {$addToSet:{family:”sister”} |
$pop | {$pop:{field:value}} | 从指定字段中数组中删除一个值,value接受正数(最后一个)和负数(第一个),一般使用1和-1 | {$pop:{family:1}} |
$pull | $pull:{field:value} | 从指定字段中的数组中删除指定的一个值 | {$pull:{family:”father”}} |
$pullAll | {$pullAll:{field:array}} | 从指定字段中的数组中删除指定的所有值 | {$pullAll:{family:[“father”,”mother”]}} |
$ | 这是一个定位器非修改器,用于定位数组中的指定键 |
如有如下的文档:
{ "_id" : ObjectId("566d151734bf4b74caf0d952"), "name" : "HuXing", "sex" : "F", "age" : 12, "pid" : "111", "family" : [{ "relation" : "father", "name" : "HuChao" }, { "relation" : "mother", "name" : "WangPing" }] }
修改家庭成员中数组中有relation为mother的元素的数组元素为其增加键sex=”F”:
db.person.update({"family.relation":"mother"},$set:"family.$.sex":"F"}})
执行结果:
{ "_id" : ObjectId("566d151734bf4b74caf0d952"), "name" : "HuXing", "sex" : "F", "age" : 12, "sid" : "111", "family" : [{ "relation" : "father", "name" : "Hu" }, { "relation" : "mother", "name" : "Ping", "sex" : "F" }] }
4. 批量更新数组
我们可以通过pushAll修改器将一个数组A更新到一个字段值为数组的字段中,但是这种操作不会判断原数组中是否已有数组A中的元素,只是简单的全部添加,通过addToSet修改器可以进行逻辑判断,若已存在不添加,但是只能一次一个元素,而不是数组形式,通过将addToSet和each进行结合可以解决这个问题。如下:原文档
{ "_id" : ObjectId("566d1e8a34bf4b74caf0d953"), "name" : "Leon", "sid" : "111", "sex" : "M", "age" : 18.0, "family" : ["father", "mother"] }
批量更新family增加语句操作:
db.person.update({name:"Leon"},{$addToSet:{family:{$each:["father","sister","brother"]}}})
更新后结果如下,没有重复的father元素:
{ "_id" : ObjectId("566d1e8a34bf4b74caf0d953"), "name" : "Leon", "sid" : "111", "sex" : "M", "age" : 18.0, "family" : ["father", "mother", "sister", "brother"] }
当查询条件或者修改内容的键名中有”.”时键名一定要用双引号(”“)包围
相关文章推荐
- MongoDB知识整理
- Mongodb联合查询
- MongoDB在Java下的增删查改
- Mongodb学习日志(一):安装使用及简单操作
- MongoDB简介与安装(ubuntu)
- Linux下安装Mongodb3.0
- php mongodb类
- MongoDB 3.0+ 安全权限访问控制
- Java连接MongoDB3.0+
- zhphp framework(二十五) mongodb 类
- mongodb数据安装
- mongoDB备份恢复数据库
- 搭建高可用MongoDB集群——副本集部署 推荐
- Nodejs学习笔记(四)——支持Mongodb
- MongoDB在Windows下的环境配置和使用
- 2015年12月12 Node.js实战(一)使用Express+MongoDB搭建多人博客
- mongoDB 3.0 安全权限访问控制
- 实战mongodb3.06 Relica Sets+sharding集群
- MongoDB(NoSQL) 入门
- Mongodb启动命令mongod参数说明