`

MongoDB入门6——查询(二)

阅读更多

 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》

0
0
分享到:
评论

相关推荐

    NoSQL介绍PPT

    常见NoSQLj介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB...

    MongoRedis的源代码:《左手MongoDB,右手Redis——从入门到商业实战》

    《左手MongoDB,右手Redis——从入门到商业实战》背后的故事。 这篇文章没有代码,请放心阅读。 一个程序员的一生应该这样度过:当她回首往事的时候,她不会因为建造环境浪费时间而悔恨,也不会因为浪费而无法这样,...

    数据结构算法

    索引操作 8天学通MongoDB——第三天 细说高级操作 8天学通MongoDB——第二天 细说增删查改 8天学通MongoDB——第一天 基础入门 UML系列(4)团队沟通利器之UML——类图 团队沟通利器之UML—— 序列图 团队沟通利器之...

    【MongoDB】数据库的基本操作01

    1.1基础入门 1.1.1应用场景 1.1.2环境搭建 1.1.3MySQL和MongoDB 1.2基本操作 1.2.1常用命令 1.2.2数据类型 1.2.3集合操作 1.2.3.1创建集合 1.2.3.2查看集合 1.2.3.3删除集合 1.2.4注意点 1.3增删改查 1.3.1插入数据 ...

    隔壁孩子10篇博客node入门而且写了一个前后端分离项目,你怎么还在睡觉!!!(五)

    ———————————————————————————————————————————————————————————— —————–今日份复习nodejs—————————- —– Mongodb数据可以介绍 —– ...

    搭建高可用mongodb集群(一)——配置mongodb

    近年来,NoSQL数据库已得到了长足的发展,更成为了许多机构追求性能的第一选择,而在这些技术堆栈中,...这里我们为大家分享上海创行科技技术总监严澜的博文——如何搭建高效的MongoDB集群。在大数据的时代,传统的关系

    教大家8天学通MongoDB——第一天 基础入门篇

    MongoDB是目前非常流行的一种非关系型数据库(NoSQL),因其操作简单、完全免费、源码公开等特点,受到了IT从业人员的青睐,并被广泛...本文教大家8天学通MongoDB——第一天 基础入门篇,感兴趣的朋友一起来了解了解吧

    App后台开发运维和架构实践

    第6 章 MySQL——App 后台最常用的数据库 .. 140 第7 章 Redis——App 后台高性能的缓存系统 . 160 第8 章 MongoDB——App 后台新兴的数据库 .. 185 第9 章 App 后台架构剖析 .. 208 第10 章 App 后台架构的演进 255

    MongoDB中javascript脚本编程简介和入门实例

    作为一个数据库,MongoDB有一个很大的优势——它使用js管理数据库,所以也能够使用js脚本进行复杂的管理——这种方法非常灵活

    nosql 入门教程

    第6章 查询NoSQL存储 101 6.1 SQL与MongoDB查询功能的相似点 101 6.1.1 加载MovieLens数据 103 6.1.2 MongoDB中的MapReduce 108 6.2 访问HBase等面向列数据库中的数据 111 6.3 查询Redis数据存储 113 6.4 小结...

    nodeapp:使用ExpressJS研究构建Rest API的项目——NodeJS

    超级测试数据库的: MongoDB入门如果我不是 nodemon,请安装项目的 nodemon 全局和本地依赖项: npm install -g nodemonnpm installnpm start运行测试npm test注意:确保 mongodb 正在运行================

    backbone源码解读

    backbone是我两年多前入门前端的时候接触到的第一个框架,当初被backbone的强大功能所吸引(当然的确比裸写js要好得多),虽然现在backbone并不算最主流的前端框架了,但是,它里面大量设计模式的灵活运用,以及令人...

    Node.js Web开发实战-(共14章)PPT.rar

    第3章 Node.js基础入门.ppt 第4章 异步编程与包管理.ppt 第5章 http模块.ppt 第6章 Web开发中的模板引擎.ppt 第7章 Node.js中的文件操作.ppt 第8章 认识express模块.ppt 第9章 MySQL数据库.ppt 第10章 Express框架....

    jobFinder:使用多种技术的演示应用程序 - NodeJS、Jade、MongoDB、Mongoose、Promises、AngularJS、Bootstrap 等

    特别感谢plexsight的精彩教程使用Node.js 构建Web 应用程序涉及的技术本教程结合了几种新兴技术—— 节点JS 表示AngularJS 使用蓝鸟的 Promise API MongoDB(猫鼬) 使用 mocha、chai、karma、phantomjs、supertest...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    12.3.6 界面模块——UI(Ribbon,Feign) 468 12.3.7 断路器监控——Monitor(DashBoard) 473 12.3.8 运行 474 12.4 基于Docker 部署 478 12.4.1 Dockerfile 编写 478 12.4.2 Docker Compose 480 12.4.3 Docker-...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    12.3.6 界面模块——UI(Ribbon,Feign) 468 12.3.7 断路器监控——Monitor(DashBoard) 473 12.3.8 运行 474 12.4 基于Docker 部署 478 12.4.1 Dockerfile 编写 478 12.4.2 Docker Compose 480 12.4.3 Docker-...

Global site tag (gtag.js) - Google Analytics