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

[经验分享] MongoDB的查询

[复制链接]

尚未签到

发表于 2018-10-26 12:04:39 | 显示全部楼层 |阅读模式
  MongoDB使用find来查询,不指定任何参数说明是对整个集合的文档查询。

  •   find查询
  指定返回的键
  有时并不需要将文档中所有键值对都返回,可以通过find(或者findOne)的第二个参数来制定想要的键,这样即会节省传输的数据量,又能节省客户端解码文档的时间和内存消耗。
  例如:
  > db.people.find()
  { "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,
  "enemies" : 2 }
  { "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  { "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }
  >
  如果只对name和age感兴趣,可以这样查询:
  > db.people.find({"name":"joe","age":21})
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  >
  但是"_id"总是被返回,即便没有指定。
  可以使用第二个参数来剔除查询结果中的某个键值对,例如,如果不希望显示"friends" : 32的键值对:
  > db.people.find({},{"friends":0})
  { "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "enemies" : 2 }
  { "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  { "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }
  >
  也可以用来防止返回"_id":
  > db.people.find({"age":21},{"_id":0})
  { "name" : "joe", "age" : 21 }
  2、查询条件
  查询不仅能精确匹配,还能匹配更加复杂的条件,比如范围,OR子句或者取反。
  2.1、查询条件
  查询条件的比较操作符:
  "$lt"  对应 <
  "$lte" 对应
  "$gte" 对应>=
  "$ne"  对应“不相等”
  > db.people.find({"age":{"$gte":30,"$lte":50}})
  { "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }
  > db.people.find({"age":{"$ne":65}})
  { "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,
  "enemies" : 2 }
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  { "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }
  "$ne" 用于所有数据的类型。
  2.1、OR查询
  有两种方式进行OR查询。
  "$in":可以用于查询一个键的多个值;
  "$or":完成多个键值的任意给定值。
  2.1.1"$in"
  对于单一键要是有多个值与其匹配的话,就要用"$in"加一个条件数组:
  > db.people.find({"age":{"$in":[21,49,65]}})
  { "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  { "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }
  >
  "$in"非常灵活,可以指定不同类型的条件和值:
  > db.people.insert({"age":"kkk"})
  WriteResult({ "nInserted" : 1 })
  > db.people.find({"age":{"$in":[21,"kkk"]}})
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  { "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }
  >
  要是"$in"对应的数组只有一个值,那么和直接匹配这个值的效果是一样的。
  > db.people.find({"age":{"$in":[21]}})
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  > db.people.find({"age":21})
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  >
  2.1.1"$nin"
  和"$in"相对的是"$nin",将返回与数组中所有条件都不匹配的文档:
  > db.people.find({"age":{"$nin":[21,49,65]}})
  { "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,
  "enemies" : 2 }
  { "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }
  >
  2.1.1"$or"
  "$or"接受一个包含所有可能条件的数组作为参数:
  > db.people.find({"$or":[{"age":"kkk"},{"friends":32}]})
  { "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,
  "enemies" : 2 }
  { "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }
  >
  同时"$or"可以包含其他条件句:
  > db.people.find({"$or":[{"age":"kkk"},{"friends":32},{"age":{"$in":[21,65]}}]})
  { "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,
  "enemies" : 2 }
  { "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }
  { "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }
  { "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }
  >
  AND型的查询,总是尽可能地用最少的条件来限定结果的范围;而OR型的查询则相反,第一个条件尽可能地匹配更多的文档,这样才是最高效的。


运维网声明 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-626758-1-1.html 上篇帖子: 【MongoDB学习笔记33】MongoDB副本集rs辅助函数 下篇帖子: MongoDB University 第五周作业——aggregate聚合高级查询
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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