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

[经验分享] MongoDB入门6——查询(二)

[复制链接]

尚未签到

发表于 2018-10-28 08:39:09 | 显示全部楼层 |阅读模式
  3.查询中null的处理
  null的匹配非常有意思:null不仅仅会匹配到指定键的值确实等于null的文档,并且还会匹配到查询所制定键不存在的文档。例如,插入下面这三个文档:
  

  
> db.users.insert({"name":"Tom","age":20,"job":"Sales"});
  
> db.users.insert({"name":"Sam","age":25,"job":"Manager"});
  
> db.users.insert({"name":"Jim","age":25});
  
> db.users.insert({"name":"Sam","age":25,"job":null});
  

  现在我们用传统的方式来匹配job为null的文档:
  

  
> db.users.find({"job":null});
  

  结果如下:
  

  
{ "_id" : ObjectId("4f0714e3edb28db4864be582"), "name" : "Jim", "age" : 25 }
  
{ "_id" : ObjectId("4f071542edb28db4864be583"), "name" : "Sam", "age" : 25, "job" : null }
  

  很明显,不仅将job确实为null的文档匹配出来,而且将没有job这个键的文档匹配出来了。很多时候这并不是我们的本意。有一个$exists操作符可以来解决这个问题。先看代码:
  

  
db.users.find({"job":{"$in":[null],"$exists":true}});
  

  结果如下:
  

  
{ "_id" : ObjectId("4f071542edb28db4864be583"), "name" : "Sam", "age" : 25, "job" : null }
  

  4.正则表达式
  MongoDB使用Perl兼容的正则表达式库来匹配正则表达式。正则表达式本身非常强大,有专门写这个的书,我这里不针对这个,只是简单的举个例子。例如,忽略大小写情况下匹配name为Tom的文档:
  

  
db.users.find({"name":/tom/i});
  

  5.数组查询
  数组查询大的思路:大部分情况下,数组的每个元素都可以是对应键的值。这么说肯定不好理解,举个例子,插入下面这样一个文档:
  

  
db.food.insert({"fruit":["apple","banana","peach"]});
  

  现在执行下面三个查询,都会将这个文档匹配出来。
  

  
db.food.find({"fruit":"apple"});
  
db.food.find({"fruit":"banana"});
  
db.food.find({"fruit":"peach"});
  

  如果需要匹配fruit键的值既有apple又有banana的文档,可以使用$all匹配符。现在我们假设有下面几个文档:
  

  
{ "_id" : ObjectId("4f071a10edb28db4864be584"), "fruit" : [ "apple", "banana", "peach" ] }
  
{ "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] }
  
{ "_id" : ObjectId("4f071c6076285076f80ca7c8"), "fruit" : [ "apple" ] }
  
{ "_id" : ObjectId("4f071ce576285076f80ca7c9"), "fruit" : [ "banana", "apple" ] }
  

  执行下面的查询:
  

  
db.food.find({"fruit":{"$all":["apple","banana"]}});
  

  可以匹配到下面的三个文档:
  

  
{ "_id" : ObjectId("4f071a10edb28db4864be584"), "fruit" : [ "apple", "banana", "peach" ] }
  
{ "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] }
  
{ "_id" : ObjectId("4f071ce576285076f80ca7c9"), "fruit" : [ "banana", "apple" ] }
  

  你可能会说,可以采用精确匹配整个数组的方法如下:
  

  
db.food.find({"fruit":["apple","banana"]});
  

  得到的结果只有一个文档:
  

  
{ "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] }
  

  不用惊讶,这就是精确匹配,连apple和banana出现的顺序都不能调换。这种结果很显然不是很多时候我们想要的。也是为什么引进$all匹配操作符。
  还有一种匹配的语法:可以使用key.index来匹配指定键对应值(是数组的情况下)的第index+1个元素值。还是上面水果的那个例子,我们假设要匹配fruit键对应值第三个元素为peach的文档,我们可以这么写:
  

  
db.food.find({"fruit.2":"peach"});
  

  注意一点,数组下标是从0开始的。
  如果我们需要匹配fruit键的值数组元素个数为3个的文档,可以使用$size匹配操作符:
  

  
db.food.find({"fruit":{"$size":3}});
  

  这样也可以将第一个文档匹配出来。但是特别需要注意,$size匹配符是不能和其他的查询条件共同使用的。比如你按照下面写是不会有结果的:
  

  
db.food.find({"fruit":{"$gt":{"$size":2}}});
  

  这是不会匹配出fruit键的值数组元素个数大于2的文档。这样不会有任何查询结果的。
  《MongoDB:The Definitive Guide》



运维网声明 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-627335-1-1.html 上篇帖子: MongoDB入门5——查询(一) 下篇帖子: 实例:MongoDB与Tomcat的结合更便捷
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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