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

[经验分享] MongoDB数据库的CURD的一些基本语句

[复制链接]

尚未签到

发表于 2017-12-16 09:55:07 | 显示全部楼层 |阅读模式
  from:http://www.data321.com/shujuku/20160514417/addToSetQianMianBuXuYaoJinXing
  插入文档:   
  SQL语句:   
  INSERT INTO 表名 (列名.......) VALUES(对应的列值.........);   
  MongoDB语句:   
  db.集合名.insert({键:值,键:值,键:值.........})   
  
  db.集合名.save({键:值,键:值,键:值........})   
  save()方法和insert()方法的区别在于,save会先判断集合当中是否存在相同的文档,如果存在不执行插入,如果不存在则执行插入。   
  删除文档:   
  SQL语句:   
  DELETE FROM 表名 WHERE 条件   
  MongoDB语句:   
  db.集合名.remove({匹配条件})   
  修改文档:   
  SQL语句:   
  UPDATE 表名 SET 列名=值 WHERE 条件   
  MongoDB语句:   
  db.表名.update({条件},{要更改的内容},upsert,是否批量修改)   
  在MongoDB中,update方法有四个参数:   
  第一个参数:是匹配条件,与SQL语句当中的where条件一样   
  第二个参数:更新内容,要更改成什么样,写在这里   
  第三个参数:upsert,如果为true,那集合中有满足第一个条件的文档,就执行更新,如果没有满足第一个条件的文档,就执行插入以条件为内容的新文档,再更新成第二个参数。   
  第四个参数:如果设为true,则更新所有满足以第一个参数为条件的文档,否则,只更新一条。   
  好,那么我来给大家说下MongoDB当中常用的修改器:   
  1.$set 修改器   
  使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$set':{"name":"捷哥浅谈MongoDB"}},0,1)   
  这条命令的意思是:将满足name为"捷哥浅谈PHP"的文档的name键更改成"捷哥浅谈MongoDB"   
  例如:我们原来的文档为:{"name":"捷哥浅谈PHP","age":1,"total":11}   
  更新以后的文档为:{"name":"捷哥浅谈MongoDB","age":1,"total":11}   
  如果我们不加$set,直接写成:db.collname.update({"name":"捷哥浅谈PHP"},{"name":"捷哥浅谈MongoDB"},0,1)   
  大家想想会是什么样的结果?   
  如果不加$set的话,更新后的文档将会是:   
  {"name":"捷哥浅谈MongoDB"}   
  其他的键都会被”干掉“,只留下name键,这显然不是我们想要的结果,所以在update方法中,$set是最常用的修改器。   
  2.$unset 修改器   
  说到unset,还记得PHP当中的unset()函数吗,它的功能是删除一个已声明的变量。   
  同样,在我们的MongoDB当中,$unset是删除文档当中的一个键   
  使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$unset':{"age":1}},0,1)   
  更新后的文档:{"name":"捷哥浅谈PHP","total":11}   
  age键会被删除掉。   
  3.$inc 增加或减少   
  使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$inc':{"total":1}},0,1)   
  意思是让total键自增1,写几就自增几,如果为负数,即为自减   
  更新后的文档:   
  {"name":"捷哥浅谈PHP","age":1,"total":12}   
  童鞋们考虑一下,如果我现在有这样一个微博的文档,内含每个人的评论信息:
  

  • {   
  • "title":"捷哥浅谈PHP",   
  • "content":"捷哥浅谈PHP篇篇文章经典",   
  • "comm":[   
  • {   
  • "name":"打酱油的",   
  • "content":"捷哥太强啦!"   
  • },   
  • {   
  • "name":"赵桐正",   
  • "content":"这个系列文章太好啦!"   
  • },   
  • {   
  • "name":"李强强",   
  • "content":"很好的帮助了我"   
  • }   
  • ]   
  • }
  如果有一个新的用户“李文凯”,来评论这条微博,内容为:“内容很精彩,千万不要错过哦!”,该怎么样往这条微博里面插入。   
  这就用到了咱们的数组修改器:   
  我们来看:   
  1.$push 修改器   
  作用:向数组末尾插入一个元素,如果没有就创建一个新的数组   
  使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$push':{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}})   
  更新后的文档为:
  

  • {   
  • "title":"捷哥浅谈PHP",   
  • "content":"捷哥浅谈PHP篇篇文章经典",   
  • "comm":[   
  • {   
  • "name":"打酱油的",   
  • "content":"捷哥太强啦!"   
  • },   
  • {   
  • "name":"赵桐正",   
  • "content":"这个系列文章太好啦!"   
  • },   
  • {   
  • "name":"李强强",   
  • "content":"很好的帮助了我"   
  • },   
  • {   
  • "name":"李文凯",   
  • "content":"内容很精彩,千万不要错过哦!"   
  • }   
  • ]   
  • }
  童鞋们,如果我现在有这样的需求,如果用户“李文凯”已经评论过此微博,我们就不让其再进行评论,大家思考一下,要怎么做?   
  我们是否可以通过判断来做,先写一个伪代码,------》如果评论内容中存在要更新的新评论,即name和content的值在评论当中已经存在,我们就不执行更新,否则则更新插入name为“李文凯”的新评论,这样可以有效的防止灌水。   
  好,我们用代码来实现:   
  db.collname.update({"name":" 李文凯","comm":{'$ne':{"name":"李文凯","content":"内容很精彩,千万不要错过哦!"}}},{'$push' :{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}});   
  这样判断会造成很大的麻烦,我们的$addToSet修改器本身就带有这样的功能,我们来试试:   
  2.$addToSet修改器   
  要完成以上需求,我们可以这样来做:   
  db.collname.update({"name":"李文凯"},{'$addToSet' :{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}});   
  大家可以看到,$addToSet前面不需要进行判断,就能达到我们的$ne配合$push完成的效果。   
  如果我们现在要更改评论里面的name为“李文凯”的评论内容,我们需要使用数组的定位修改器$:   
  db.collname.update({"comm.name":"李文凯"},{'$set':{"comm.$.content":"我是李小凯"}})   
  大家再考虑这样一个问题,如果我们的一个用户集合当中,存在一个用户文档,里面有姓名,性别,年龄,爱好(以数组的形式存储)等键,例如:
  

  • {   
  • "name":"捷哥",   
  • "sex":"纯爷们",   
  • "age":27,   
  • "hobby":[   
  • "football",   
  • "basketball",   
  • "sing"   
  • ]   
  • }
  我们现在有这样一个需求,在网页当中如果用户勾选了某些爱好的复选框,我们就批量执行插入这些爱好。   
  有些童鞋会这样想,我们使用$push或者$addToSet直接插入数组就行:   
  db.user.update({"name":"捷哥"},{'$push':{"hobby":["PHP","JAVA"]}})   
  大家认为这样可以吗?答案是否定的,执行该条语句后的结果为:
  

  • {   
  • "name":"捷哥",   
  • "sex":"纯爷们",   
  • "age":27,   
  • "hobby":[   
  • "football",   
  • "basketball",   
  • "sing",   
  • [   
  • "PHP",   
  • "JAVA"   
  • ]   
  • ]   
  • }
  这显然不是我们想要的结果,这样就需要我们使用$each来配合$addToSet来使用。   
  3.$each   
  我们来看$each,这里我们这样来实现:   
  db.user.update({"name":"捷哥"},{'$addToSet':{"hobby":{'$each':["PHP","JAVA"]}}})   
  这样我们更新后的文档为:
  

  • {   
  • "name":"捷哥",   
  • "sex":"纯爷们",   
  • "age":27,   
  • "hobby":[   
  • "football",   
  • "basketball",   
  • "sing",   
  • "PHP",   
  • "JAVA"   
  • ]   
  • }
  正如童鞋们所见,这样的结果才是我们想要的结果。   
  注意:$each不能使用$push配合使用,只能使用$addToSet。   
  4.$pop 修改器   
  作用:删除数组的第一个元素或者最后一个元素   
  使用方法:db.user.update({"name":"捷哥"},{'$pop':{"hobby":1}});   
  修改后的文档就会变成:
  

  • {   
  • "name":"捷哥",   
  • "sex":"纯爷们",   
  • "age":27,   
  • "hobby":[   
  • "football",   
  • "basketball",   
  • "sing",   
  • "PHP"   
  • ]   
  • }
  “1”表示从数组末尾删除一个元素,“-1”表示从数组开头删除一个元素,因此,   
  db.user.update({"name":"捷哥"},{'$pop':{"hobby":-1}});   
  运行后的文档更新为:
  

  • {   
  • "name":"捷哥",   
  • "sex":"纯爷们",   
  • "age":27,   
  • "hobby":[   
  • "basketball",   
  • "sing",   
  • "PHP",   
  • "JAVA"   
  • ]   
  • }
  那如果我们现在要删除爱好里面的“sing”,这个元素既不是开头第一个元素,也不是末尾的最后一个元素,显然我们使用$pop已经满足不了这个需求了,这时我们就需要使用$pull修改器了。   
  5.$pull 修改器   
  作用:删除数组当中的指定元素   
  使用方法:db.user.update({"name":"捷哥"},{'$pull':{"hobby":"sing"}})   
  以上文档修改以后的文档就会变成:
  

  • {   
  • "name":"捷哥",   
  • "sex":"纯爷们",   
  • "age":27,   
  • "hobby":[   
  • "basketball",   
  • "PHP",   
  • "JAVA"   
  • ]   
  • }
  由此可见,$pull可以删除数组中的指定的元素,也就是说我们可以任意删除指定的爱好兴趣。   
  好了,今天把我们常用的修改器都给大家讲了一下,不知道大家都能看明白吗,有问题的话可以跟帖回复提问,也可以给我发邮件lijie@lampbrother.net

运维网声明 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-424630-1-1.html 上篇帖子: mongoDB开发规范 下篇帖子: MongoDB 3.4.2 配置 CentOS 6.5 远程连接
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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