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

[经验分享] MongoDB(3): 查询

[复制链接]

尚未签到

发表于 2018-10-25 09:15:37 | 显示全部楼层 |阅读模式
  一、普通查询
  find方法语法:
  find([条件,需显示的字段]);
  注意:
  1、如果没有条件,则查询全部
  2、如果没有显示指定_id字段隐藏,则默认会显示,显示指定隐藏,如:find({},{"_id":0});
  1.1、查看集合中所有的文档
  命令:db.集合名称.find();
DSC0000.jpg

  1.2、查看集合中第一个文档
  命令:db.集合名称.findOne({条件对象});
DSC0001.jpg

  1.3、指定需要返回的键
  在find方法的第二个参数进行指定。默认情况下,始终会返回”_id”,可以通过设置字段为0来表示不返回这个字段。
DSC0002.jpg

  二、条件查询
  find方法语法:
  find([条件,需显示的字段]);
  在find方法里面加入条件数据即可,find方法的第一个参数就是。
  注意:条件数据必须是常量值,不能是另外的字段的数据
  1:比较操作
  $lt:小于
  $lte:小于等于
  $gt:大于
  $gte:大于等于
  $ne:不等于
  如:a、age小于20
  > db.test1.find({"age":{$lt:20}});  b、age小于20,大于10
  > db.test1.find({"age":{$lt:20,$gt:10}});  2:$and:包含多个条件,他们之间为and的关系
> db.test1.find({$and:[{"userId":2},{"username":"lisi"}]});  等价于下面:
> db.test1.find({"userId":2,"username":"lisi"});  3:$or :包含多个条件,他们之间为or的关系 ,$nor相当于or取反
  操作方式与$and差不多
  4:$not:用作其他条件之上,取反
> db.test1.find({"userId":{$not:{$ne:3}}});  
> db.test1.find({"userId":{$not:/1/}});
  5:$mod:将查询的值除以第一个给定的值,如果余数等于等二个值则匹配成功
> db.test1.find({"age":{$mod:[100,3]}});  说明:
  age除以100,如果余数为3,则满足条件
  6:$in :查询一个键的多个值,只要键匹配其中一个即可 , $nin为不包含
> db.test1.find({"userId":{$in:[1,2]}});  7:$all:键需要匹配所有的值
> db.test1.find({"userId":{$all:[1,2]}});  8:$exists:检查某个键是否存在,1表示存在,0表示不存在
> db.test1.find({"userId":{$exists:1}});  9:null类型:不仅能匹配键的值为null,还匹配键不存在的情况
> db.test1.find({"age":null});  三、正则表达式
  MongoDB使用Perl兼容的正则表达式(PCRE),比如:
  db.users.find({“name”:/sishuok/i}); 又比如:
  db.users.find({“name”:/^sishuok/});
  四、查询数组
  1:单个元素匹配,就跟前面写条件一样,{key:value}
> db.test1.find({"score":5});  2:多个元素匹配,使用$all, {key:{$all:[a,b]}},元素的顺序无所谓
> db.test1.find({"score":{$all:[7,2]}});  3:可以使用索引指定查询数组特定位置, {“key.索引号”:value}
> db.test1.find({"score.1":7});  4:查询某个长度的数组,使用$size
> db.test1.find({"score":{$size:5}})  5:指定子集,使用$slice,正数是前面多少条,负数是尾部多少条,也可以指定偏移量和要返回的元素数量,比如:$slice:[50,10]
> db.test1.find({},{"score":{$slice:2}});  指定偏移量和要返回的元素数量,比如:偏移量1,返回两个元素:
> db.test1.find({},{"score":{$slice:[1,2]}});  6:可以使用$来指定符合条件的任意一个数组元素,如:{”users.$”:1}
> db.test1.find({"score":{$in:[2,5]}},{"score.$":1});  7:$elemMatch:要求同时使用多个条件语句来对一个数组元素进行比较判断
> db.test1.find({"score":{$gt:5,$lt:4}});  
{ "_id" : ObjectId("5925a29652b61a20c53dfd48"), "score" : [ 7 ] }
  
>
  说明:上面语句并不是我们想要的,“大于5,小于4”,应该是不存在的,这里如果想让其生效,相当于and,则使用:$elemMatch
> db.test1.find({"score":{$elemMatch:{$gt:5,$lt:4}}});  
>
  五、查询内嵌文档
  1:查询整个内嵌文档与普通查询是一样的
DSC0003.png

  2:如果要指定键值匹配,可以使用“.” 操作符,比如:{“name.first”:”a”,“name.last”:”b”}
> db.test1.find({"user.id":1});  
{ "_id" : ObjectId("5925a2a552b61a20c53dfd49"), "user" : { "id" : 1, "username" : "zhangsan" } }
  
>
  3:如果要正确的指定一组条件,那就可能需要使用$elemMatch,以实现对内嵌文档的多个键进行匹配操作
  只有内嵌文档中的有key的值是数组
  注意:内嵌文档的查询必须要整个文档完全匹配
  4:$where查询
  在查询中执行任意的JavaScript,通过编程来解决查询的匹配问题,方法返回boolean值。
> function t1() {  
... for(var a in this) {
  
...  if (a.userId==2) {
  
...   return true;
  
...  }
  
... }
  
... return false;
  
... };
  
> db.test1.find({$where:t1});
  如果返回true,文档作为结果的一部分被返回;如果为false,则不会返回。
  使用的时候:db.users.find({"$where":t1});
  注意:$where性能较差,安全性也是问题,所以不到万不得已,不要使用
  还可以这样:
> db.test1.find({$where:"this.userId==1"});  六、分页与其它相关
  6.1、查询记录条数的命令:count
  1:直接使用count()的话,得到的是整个记录的条数
> db.test1.find().count();  
4
  2:如果要获取按条件查询后记录的条数,需要指定count(true或者非0的数)
> db.test1.find().limit(2).count();  
4
  
> db.test1.find().limit(2).count(1);
  
2
  
>
  6.2、限制返回的记录条数的命令:limit(要返回的条数)
> db.test1.find().limit(2);  
{ "_id" : ObjectId("5925a29652b61a20c53dfd48"), "userId" : "1", "age" : 13, "score" : [ 7, 7, 2, 5, 4 ] }
  
{ "_id" : ObjectId("5925a2a552b61a20c53dfd49"), "user" : { "id" : 1, "username" : "zhangsan" } }
  
>
  6.3、限制返回的记录条数起点的命令:skip(从第几条开始返回)
> db.test1.find().skip(2).limit(2);  
{ "_id" : ObjectId("5926b15e52b61a20c53dfd4a"), "user" : { "id" : 2, "username" : "lisi" } }
  
{ "_id" : ObjectId("5926b6ce31e6d30b1b5084cd"), "userId" : 5, "name" : "zhangsan" }
  
>
  6.4、排序的命令:sort({要排序的字段:1为升序,-1为降序})
> db.test1.find().sort({"userId":1});  对多个字段进行排序:
> db.test1.find().sort({"userId":1,"username":1});  MongoDB处理不同类型的数据是有一定顺序的,有时候一个键有多种类型的值,其排序顺序是预先定义好的,从小到大如下:
  (1)最小值 (2)null (3)数字 (4)字符串
  (5)对象/文档 (6)数组 (7)二进制数据 (8)对象id
  (9)布尔类型 (10)日期型 (11)时间戳 (12)正则表达式
  (13)最大值
  6.5、分页查询:组合使用limit,skipt和sort
  数据量比较小时,建议使用;当数据量比较大时,建议使用其他方式来分页,比如采用自定义的id,然后根据id来分页
  skipt的检索方式:如果有100条数据,我想要第59条,那么skipt也会检索出前面58条,只是在第59条时返回。
  6.6、查询给定键的所有不重复的数据,命令:distinct
  语法:db.runCommand({“distinct”:集合名,“key”:”获得不重复数据的字段”});
> db.runCommand({"distinct":"test1","key":"userId"});  
{ "values" : [ "1", 5 ], "ok" : 1 }
  七、游标
  1:获取游标,示例如下:
> var c = db.test1.find();  2:循环游标,可以用集合的方式,示例如下:
> while(c.hasNext()){  
... printjson(c.next());
  
... }
  3:也可以使用forEach来循环,示例如下:
> c.forEach(function(obj){  
... printjson(obj);
  
... });
  效果:
DSC0004.png

  八、存储过程
  1:MongoDB的存储过程其实就是个自定义的js函数
> var addf = function(a,b){  
... return a+b;
  
... }
  
>
  2:使用db.system.js.save({“_id”:名称,value:函数})存储函数;
> db.system.js.save({"_id":"myF","value":addf});  3:可以通过如下命令查看:db.system.js.find();
DSC0005.png

  4:可以通过如下命令调用:db.eval(名称);
DSC0006.png

  注意:尽量避免使用游标与游标



运维网声明 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.iyunv.com/thread-626174-1-1.html 上篇帖子: MongoDB(2): 增删改操作 下篇帖子: Java操作MongoDB-SimpleLife
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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