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

[经验分享] Mongodb常用命令之查询

[复制链接]

尚未签到

发表于 2018-10-27 11:13:58 | 显示全部楼层 |阅读模式
  上一篇讲完了mongodb的增、删、改,本文就来讲解他的强大的查询功能。
  一、find命令简介及初探
  在mongodb中的查询使用的是find()命令。他2个参数,第一个参数是你的查询条件(默认为{}表示查询所有),第二个参数是指定你要返回的键(默认为{}表示返回所有)。下面我们将详解find()命令:
  初始数据:db.user.save({name:"zhangsan",age:26,sex:"women",num:[1,2,4],height:164})
  db.user.save({name:"lisi",age:22,sex:"man",num:[2,3,4],height :null})
  db.user.save({name:"wangwu",age:29,sex:"man"})
  a.查询user集合中所有的数据:db.user.find(),其实db.user.find()是db.user.find({})的简写,看着方便,舒服。
  b.查询name为lisi而且age为22的文档:db.user.find({name:"lisi",age:22});
  c.从返回的结果指定的返回键,查询name为lisi且只返回age键:db.user.find({name:"lisi"},{age:1}),但是你会发现"_id"这个键总是会返回回来,即使你没指定也一样,你可以使用{"_id":0}来不让其返回,如db.user.find({name:"lisi"},{age:1,"_id":0}).
  d.指定返回结果中不希望有某些个键,如查询name为lisi只不返回age这个键:db.user.find({name:"lisi"},{age:0}),其实和上一条差不多,只是相反。
  在这里不得不说的就是findOne命令:他表示只返回结果中的第一条数据,如:
  db.user.findOne();
  二、深入了解find()里的各种查询
  
  $lt,$lte,$gt,$gte(条件句):他们分别对应的是:=。
  例:查询年龄在22到26岁(含)之间的数据:db.user.find({age:{$gte:22,$lte:26}})
  $ne:ne也就是not equal ,说白点就是不等于。
  例:查询年龄不等于22的数据:db.user.find({age:{$ne:22}})
  原文地址:http://1145004.blog.51cto.com/1135004/1265522
  $in,$all,$nin(三个跟的是数组):这三个查询操作可以接受一个到多个值的列表,也就是一个数组。
  $in和mysql的in关键字很像,也相当于mysql中的or关键字的意思,表示满足这个数组之内的值之一都能查询出来.
  例:查询name为zhangsan和lisi的数据:db.user.find({name:{$in:["zhangsan","lisi"]}})
  $nin:这个就是not in的缩写,与in相反,也就是不在该数组之内的值会被查询出来。
  例:db.user.find({name:{$nin:["zhangsan","wangwu"]}})将返回name为lisi的文档,而不会返回name为zhangsan、wangwu的文档。
  $all这个东西和$in很像,但$all要求必须满足数组内所有的值。
  例:db.user.find({num:{$all:[1,2]}})能查出{num:[1,2,4]}的文档,而查不出{num:[2,3,4]}的文档。
  $or因为$in等只能对单一个键进行查询,而$or和mysql中的or差不多,对多个键进行或者查询(只要满足其一就能查询出来),or后面跟的是一个数组。
  例:查询出name为"lisi"或者年龄为24的数据:db.user.find({$or:[{name:"lis"},{age:24}]})
  $mod表示取余。
  例:db.user.find({age:{$mod:[5,1]}})表示将查询age为1,6,11,16,21,26等用户,这里就会查询出age为26的用户。
  注(重)
  1。条件句(如$lt)是内层文档的键,修改器(如$set)是外层文档的键。一个键可以有多个条件,但一个键不能对应多个更新修改器。如:db.user.update({name:"wangwu"},{$inc:{age:1},$set:{age:20}})这样更新不成功,因为age键被修改了两次。
  2。$in,$all会用到索引,而$nin不会用到索引,故多优先推荐$in,$all使用。
  null值的查询:null是一个奇怪的东西。我们通过例子来查看,
  例:我们要查询出heigth为null的数据,db.user.find({height:null})你会发现返回的不光是{height:null}的值,还会返回没有height键的文档。如果仅想要匹配键值为null的,还须要用到$exists操作符。如db.user.find({height:{$in:[null],$exists:true}})就能只返回height为null的文档了。注:由于mongodb无"$eq"操作符号,所以使用$in来代替。
  正则表达示:能够很灵活的匹配字符串,例如实现mysql中的like功能。
  例:
  查询name以w开头的数据:
  db.user.find({name:/^w/});
  查询name 包括si的数据:
  db.user.find({name:/si/});
  查询name 包括si或者SI的数据(也就是不区分大小写):
  db.user.find({name:/si/i})   ,i表示不区分大小写。
  三、数组:
  
  前面的$in,$all都是用于数组的,前面讲过了这里就不再解释了。
  $size针对数组用的,可用于查询指定数组的长度。
  例:我要查询出num的长度为3的数据,db.user.find({num:{$size:3}})
  $slice因为find第二个参数是指定返回的键,但$slice返回数组的一个子集合。让我们通过例子来说明他的用法及作用。
  例:
  a.我想返回name为" zhangsan "中num数组的前两个值:
  db.user.find({name:" zhangsan "},{num:{$slice:2}}),就会返rsult的所有键且num数组只会返回前两个元素[1,2]。
  b.我想返回name为" zhangsan "中num数组的最后两个值:
  db.user.find({name:"zhangsan "},{num:{$slice:-2}}),就会返rsult的所有键且num数组只会返回前两个元素[2,4]。
  c.我想返回name为" zhangsan "中num数组的第二到第三个元素:
  db.user.find({name:" zhangsan "},{num:{$slice:[1,3]}}),就会返rsult的所有键且num数组会跳过第一个元素而返回第二个和第三个元素[2,4]。
  通过指定数组位置来查询:
  例:db.user.find({"num.1":3})表示查询num数组的第二个位置值为3的文档,即返回name为lisi的文档。
  统计一个文档某一数组的长度(大小):
  例:我们要得到name为zhangsan文档中num组的长度,db.user.findOne({name:"zhangsan"}).num.length.
  查询内嵌文档:
  来两条初始数据:db.user.save({name:"zangsan",age:22,stu:{name:"lidao",age:21}});
  db.user.save({name:"lisi",age:23,stu:{name:"xiaodao",age:20}});
  我们要查询lisi的学生姓名为xiaodao的文档:db.user.find({"stu.name":"xiaodao"})
  注意:我们在使用内嵌查询时在键上一定要加"",不然会报错的,如"stu.name"正确,而stu.name会报错误。
  四、游标:
  mongodb使用游标来返回find的执行结果,因为游标类还实现了迭代器接口,所以还在可以在foreach中使用。
  这里用一个简单的例子来说明:
  var result =  db.user.find()
  while(result.hasNext){
  obj  = result.next();
  print(obj.name);
  }
  $where有些需求无法满足时,$where就出现了,用它可以执行任意js作为查询的一部分,有了他几乎能做任何事。
  例:查询年龄大于26的数据:
  db.user.find({$where:"this.age> 26"})
  他等同于:=>var f =function(){return this.age > 26;}
  =>db.user.find(f)
  $limit限制返回结果用的,此外$limit指定的是上限而非下限,如果不够就返回查询到的全部。
  例:我要返回user集合所有数组的前两条,db.user.find().limit(2);
  $skip他配合$limit使用的,也可以单独使用,且尽量避免过大量结果。我们通过例子说明。
  例: db.user.find().skip(1);表示从第二条数据返回,也就是只返回name为lisi和wangwu的文档。
  db.user.find().skip(1).limit(1);表示从第二条数据返回且只返回第一条数据,即name为lisi的文档。
  注:$skip不适合作分页使用,因为假如有一百万数据,你就要略过大量结果,所以效率非常你,不适合作分页。
  $sort对返回的结果进行排序。
  例:db.user.find().sort({age:1}),表示将返回的结果按age键进行升序排列。
  最后一个说明 distinct操作:表示获取特定键中不同值列表的最简单的工具。
  例:db.user.find("name")他将返回["zhangsan","lisi","wangwu"]
  注:distinct返回是有限制的,他的返回结果必须是16M。


运维网声明 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-627067-1-1.html 上篇帖子: Java实现MongoDB的日期(Date)分组功能 下篇帖子: [MongoDB] 1. MongoDB 安装配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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