mongoDB文档操作
数据库操作无非就是增、删、改、查。这篇主要介绍增、删、改。
1.增
Mongodb插入操作很简单,使用关键字“insert”。实例:
1 > db.test.blog.insert({"haha":"xiaohaha","abc":"123"}) 2 > db.test.blog.find(); 3 { "_id" : ObjectId("5334dd149b7a445ea2166559"), "title" : "love", "content" : "I 4 love you" } 5 { "_id" : ObjectId("5334dd669b7a445ea216655a"), "job" : "java", "city" : "wuhan" 6 } 7 { "_id" : ObjectId("5334ec3f9b7a445ea216655b"), "a" : "b" } 8 { "_id" : ObjectId("5338bc89125a366c3f32dd00"), "haha" : "xiaohaha" } 9 { "_id" : ObjectId("5338bce3125a366c3f32dd01"), "haha" : "xiaohaha", "abc" : "12 10 3" } 11 >
使用insert关键字,里面设置文档。如果文档中没有“_id”,Mongodb会自动生成。
当执行插入操作时,数据库会校验是否包含“_id”键,并且文档不超过4MB,除此之外,不做其他检查。这样使得数据库更加安全,远离注入式攻击(Mongodb在插入时不执行代码)。
2.删
1 > db.test.blog.remove({"a":"b"}) 2 > db.test.blog.find({"a":"b"}) 3 > db.test.blog.remove()
remove可以接受一个查询文档作为可选参数,给定参数以后,只有符合条件的文档才会被删除。如果没有带参数,那么就是删除集合中的所有文档,但是不会删除集合本身,原来的索引也会保留。
3.改
文档存入数据库后,可以使用update方法来修改它,update有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档做哪些修改。更新操作时原子的,若是两个更新同时发生,先到达服务器的先执行,接着执行另一个。
更新方式一:文档结构变动比较大使用
1 > var jobs = db.test.blog.findOne({"job":"java"}); //这里这能查询单个对象,才能在后面使用update修改 2 > jobs.job = "hadoop"; 3 hadoop 4 > jobs.exp = "5 year"; 5 5 year 6 > jobs.city = ["wuhan","beijin","shanghai"]; 7 [ "wuhan", "beijin", "shanghai" ] 8 > db.test.blog.update({"job":"java"},jobs); //使用update修改 9 > db.test.blog.find({"job":"hadoop"}); 10 { "_id" : ObjectId("5334dd669b7a445ea216655a"), "job" : "hadoop", "city" : [ "wuhan", "beijin", "shanghai" ], "exp" : "5 year" }
更新方式二:使用修改器,文档只做部分更新使用
- $set和$unset
$set用来指定一个键的值。如果键不存在,则创建它。可以用来修改值,数组,内嵌文档。
$unset用来卸载一个键值对。
1 > db.test.blog.insert({"_id":0001,"name":"joe","age":25,"favortie":"book"}); //插入数据 2 > db.test.blog.find(); //查询 3 { "_id" : 1, "name" : "joe", "age" : 25, "favortie" : "book" } 4 > db.test.blog.update({"name":"joe"}, //更新单个数据age,并且改变数据类型int->string 5 ... {"$set":{"age":"29"}}) 6 > db.test.blog.find(); 7 { "_id" : 1, "age" : "29", "favortie" : "book", "name" : "joe" } 8 > db.test.blog.update({"name":"joe"}, //变为数组 9 ... {"$set":{"favortie":["book","tv"]}}) 10 > db.test.blog.find(); 11 { "_id" : 1, "age" : "29", "favortie" : [ "book", "tv" ], "name" : "joe" }
$unset代码
1 > db.test.blog.find(); 2 { "_id" : 1, "age" : "29", "favortie" : [ "book", "tv" ], "name" : "joe" } 3 > db.test.blog.update({"name":"joe"}, 4 ... {"$unset":{"age":1}}) 5 > db.test.blog.find(); 6 { "_id" : 1, "favortie" : [ "book", "tv" ], "name" : "joe" }
更新数字
$inc用来增加键值,键不存在时创建
1 > db.test.blog.update({"name":"joe"},{"$inc":{"age":1}}); 2 > db.test.blog.find(); 3 { "_id" : 1, "age" : 1, "favortie" : [ "book", "tv" ], "name" : "joe" }
数组修改器
$push会向已有的数组末尾加入一个元素,要是没有就创建数组
1 > db.test.blog.find(); 2 { "_id" : 1, "age" : 1, "like" : [ "eat", "booke" ], "name" : "joe" } 3 > db.test.blog.update({"name":"joe"},{$push:{"like":"abc"}}); 4 > db.test.blog.find(); 5 { "_id" : 1, "age" : 1, "like" : [ "eat", "booke", "abc" ], "name" : "joe" }
$pop可以从数组任何一端删除元素。{$pop:{key:1}}从数组末尾删除,{$pop:{key:1}}则从头部删除
$pull基于特定条件删除
1 > db.test.blog.update({"name":"joe"},{$pull:{"like":"booke"}}); 2 > db.test.blog.find(); 3 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" }
数组定位
数组定位可以使用位置或者定位操作符“$”
数组下标都是从0开始,所以可以使用下标直接作为键来选择元素
使用upsert(update or insert)
upsert是一种特殊的更新,要是没有文档符合更新要求,就会以这个条件和更新文档做为基础创建一个新的文档。如果找到匹配的文档,则正常更新。update的第三个参数表示是否使用upsert更新
1 > db.test.blog.find() //查询所有数据 2 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" } //没有我要更新的数据 3 > db.test.blog.update({"url":"www.baidu.com"},{"$inc":{"visits":1}},true) //使用upsert方式修改 4 > db.test.blog.find() //查询所有数据,发现多了一个文档 5 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" } 6 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 7 " : 1 } 8 > db.test.blog.update({"url":"www.baidu.com"},{"$inc":{"visits":1}},true) //再次使用upsert 9 > db.test.blog.find() 10 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" } //发现是修改文档 11 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 12 " : 2 }
更新多个文档
默认情况下,更新只对符合条件的第一个文档进行修改,如果有多个符合条件的文档,其余文档就没有变化。如果想要更新所有匹配条件的文档,就要设置第四个参数为true
1 > db.test.blog.find({"url":"www.baidu.com"}); //查询url为baidu的记录有两条 2 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 3 " : 2 } 4 { "_id" : "2", "url" : "www.baidu.com", "visits" : "5" } 5 //更新所有符合条件的数据 6 > db.test.blog.update({"url":"www.baidu.com"},{"$set":{"visits":10}},false,true) 7 8 > db.test.blog.find({"url":"www.baidu.com"}); //重新查询,数据都修改了 9 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 10 " : 10 } 11 { "_id" : "2", "url" : "www.baidu.com", "visits" : 10 }
update的四个参数描述:
1.需要更新文档匹配的条件
2.需要更新的数据
3.是否采用upsert方式更新:默认false
4.是否使用匹配条件的文档都修改:默认false
当神已无能为力,那便是魔渡众生

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
HA机制下的Hadoop配置
[ 版权申明:本文系作者原创,转载请注明出处] 文章出处: http://www.cnblogs.com/sdksdk0/p/5585355.html 作者: 朱培 ID:sdksdk0 -------------------------------------------------- 在我之前的一篇博客中,已经分享了关于hadoop的基本配置,地址: http://blog.csdn.net/sdksdk0/article/details/51498775,但是那个是使用与初学者学习和测试的,今天用分享的这个比上次那个要复杂一些,主要是加了zookeeper和两台namenode的配置,同时使用这种方式,可以解决服务器的脑裂问题。 一、hdfs的HA机制 NameNode服务器一台是ACTIVE和一台是STANDBY。通过Qjournal(日志管理系统) 使用zkfc(基于zookeeper失败切换控制) 如何防止脑裂现象: 当ACTIVE假死的时候,STANDBY的zkfc会发出指令 ssh kill-9 namenode 返回0(成功杀死,返回1则杀死失败)的时候再去通知第二...
- 下一篇
[Hadoop]SSH免密码登录以及失败解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/51689041 1.创建ssh-key 这里我们采用rsa方式,使用如下命令: xiaosi@xiaosi:~$ ssh-keygen -t rsa -f ~/.ssh/id_rsa Generating public/private rsa key pair. Created directory '/home/xiaosi/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/xiaosi/.ssh/id_rsa. Your public key has been saved in /home/xiaosi/.ssh/id_rsa.pub. The key fingerprint is: SHA256:n/sFaAT94A/xxxxxxxxx...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2更换Tomcat为Jetty,小型站点的福音