设为首页 收藏本站
查看: 1069|回复: 0

[经验分享] MongoDB的学习--文档的插入、删除和更新

[复制链接]

尚未签到

发表于 2015-7-6 09:42:54 | 显示全部楼层 |阅读模式
  最近在看《MongoDB权威指南》,写博客记录一下相关内容~~
  关于安装之类的最基本的就不多说了,从基本操作增删改查开始。
  MongoDB官网地址:http://www.mongodb.org/
  我使用的是MongoDB 2.4.8

插入文档



db.user.insert({"name":"jun"})
  在user中插入一条记录。这个操作会给文档添加一个"_id"键。如下图所示:
DSC0000.png
  如果要插入多个文档,使用批量插入会快一些,一次批量插入只是单个TCP请求,无需处理大量的消息头,减少了插入时间。



db.user.insert([{"name":"jun"},{"name":"jun12"}])
  这个可能是在新版本才支持的,在网上的博客中都说shell不支持。
DSC0001.png
  MongoDB消息的长度最大是16M,所以使用批量插入时还是有限制的。
  MongoDb插入原理:使用驱动程序进行插入的时候,会将数据转换成BSON格式。数据库会解析BSON,并检验是否含有“_id”键。而且每次插入文档不能超过4M。

删除文档



db.user.remove()
  上面的命令会删除user集合中的文档,但不会删除user集合本身,索引也会保留。
  remove函数可以接受一个查询作为可选参数。给定参数之后,只有符合条件的文档才会被删除。



db.user.remove({"name":"jun"})
  上面的命令会删除user集合中name为jun的文档。如下图所示:
DSC0002.png
  删除数据是永久的,不能撤销也不能恢复。

更新文档

1.文档替换



db.user.update({"_id":ObjectId("52d791307ae252f9149547c9")},jun)
  将_id为ObjectId("52d791307ae252f9149547c9")的文档更新为jun,jun是一个object。
  详细如下图
DSC0003.png
  先将查找的数据复制给jun变量,修改name属性,在使用命令db.user.update({"_id":ObjectId("52d791307ae252f9149547c9")},jun)在数据库中更新。当update时,数据库会去查找一个_id为ObjectId("52d791307ae252f9149547c9")的文档,并替换它。update时最好使用_id。

2.使用修改器
  当文档只需要修改一部分时,利用原子的更新修改器,效率更高。

1."$set"修改器
  "$set"是用来设置一个键的值的,如果这个键不存在,就创建它。



db.user.update({"name":"jun12"},{"$set":{"email":"jun@126.com"}})
  使用$set修改器向name为jun12的文档里添加或修改键email为jun@126.com
  详细如下图
DSC0004.png
  如果使用如下命令



db.user.update({"name":"jun12"},{"email":"jun@126.com"})
  会将name为jun12的文档替换为文档{"email":"jun@126.com"},就相当于前面的文档替换。
  如果要删除一个key就使用对应的$unset



db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $unset: {"email" : 1}});
  执行完这条命令后,_id是ObjectId('54deeacc2736e74e058b4568')的文档里就会移除email的key。

2."$inc"修改器
  "$inc"修改器可以用来增加已有键的值,或者在建不存在时创建一个键。



db.user.update({"name":"jun12"},{"$inc":{"score":100}})
  上面的命令会在name为jun12的文档的score键上加100,如果score键不存在,就创建score键,并把值设置为增加量100。
  详细如下图
DSC0005.png
  "$inc"只能用于整数、长整数或双精度浮点数,不仅仅其后的值,而且要更新的键值也要满足。如果用在其他类型的数据上就会导致操作失败。其中包括很多语言会自动转换成数字的类型,例如null、布尔类型或数字构成的字符串。"$inc"专门用来增加或减少(数字为负数)数字的。

3."$push"修改器
  "$push"修改器可以向数组的末尾加入一个元素,如果指定的键不存在,就会创建一个新数组,并把要插入的元素插入。



db.user.update({name:"jun12"},{$push:{tel:12345678902}})
  上面的命令会在name为jun12的文档的tel键上插入一个元素12345678902,如果tel键不存在,就创建tel键,并出插入元素。
  详细如下图
DSC0006.png
  如果要添加多条,可以使用$pushAll,代码如下



db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $pushAll: {tel : [15155555555,13133334343]}});
4."$addToSet"修改器
  "$addToSet"也可用来插入数组元素,与"$push"不同的是,当要插入的元素在数组中已经存在时,"$addToSet"就不会再次插入。可以用来避免重复。



db.user.update({_id:ObjectId("52d791327ae252f9149547cb")},{$addToSet:{tel:12345678903}})
  详细如下图
DSC0007.png
  第一次插入因为存在相同元素没有插入,第二次插入tel中。

5."$each"修改器
  "$each"用来循环,与"$addToSet"结合使用,可以不重复的插入多个元素。



db.user.update(
  {_id:ObjectId("52d791327ae252f9149547cb")},
  {$addToSet:{tel:{$each:[12345678903,12345678904,12345678905]}}}
)
  详细如下图
DSC0008.png

6."$pop"修改器
  "$pop"作用与"$push"相反,可以从数组中删除元素,{$pop:{key:1}}从数组末尾删除一个元素,{$pop:{key:-1}}则从头部删除。



db.user.update(
  {_id:ObjectId("52d791327ae252f9149547cb")},
  {$pop:{tel:1}}
)
  详细如下图
DSC0009.png

7."$pull"修改器
  "$pull"修改器会将所有符合条件的元素都删掉。



db.user.update({},{$pull:{tel:12345678901}})
  详细如下图
DSC00010.png
  如果有多条,可以使用$pullAll,代码如下



db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $pullAll: {tel : [12345678902,12345678903]}});
8."$"修改器
  若数组有多个值,我们只想对其中一部分进行操作,就需要用位置或者定位操作符"$"。



db.blog.update(
  {"comments.author":"jun"},
  {"$set":{"comments.$.author":"harry"}}   
)
  定位符职匹配第一个,会将jun的第一个评论的名字修改为harry。



upsert操作
  upsert是一种特殊的更新。要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。
  其命令就是将update的第3个参数设为true。



db.blog.update(
  {"url":"/blog"},
  {"inc":{"visit":1}},
  true)
  upsert是原子性的,比起查询出来,判断是否存在,再决定添加还是修改要高效的多。

更新多个文档
  默认情况下更新只针对第一个匹配的文档执行,若要使所有匹配的文档都更新,只需设置update的第4个参数为true。



db.blog.update(
  {"visit":1},
  {"inc":{"visit":1}},
  false, true)
findAndModify
  拥有类似事务特性的更新与查询操作。它是原子性的,会返回符合查询条件的更新后的文档。
  一次只能处理一个文档,也就是条件query条件,且执行sort后的第一个文档。
  比破铜更新要慢,大概耗时相当于一次查找、一次更新和一次getLastError顺序执行所需的时间。



db.COLLECTION_NAME.findAndModify({query:{}, update:{}, remove:true|false, new:true|false, sort:{}, fields:{}, upsert:true|false});
  query是查询选择器,与findOne的查询选择器相同
  update是要更新的值,不能与remove同时出现
  remove表示删除符合query条件的文档,不能与update同时出现
  new为true:返回个性后的文档,false:返回个性前的,默认是false
  sort:排序条件,与sort函数的参数一致。
  fields:投影操作,与find*的第二个参数一致。
  upsert:与update的upsert参数一样。
  
  今天就先到这里~~该去吃饭了~~
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83705-1-1.html 上篇帖子: 提高生产性工具(五) 下篇帖子: C#操作MongoDB
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表