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》
分享到:
相关推荐
常见NoSQLj介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB...
《左手MongoDB,右手Redis——从入门到商业实战》背后的故事。 这篇文章没有代码,请放心阅读。 一个程序员的一生应该这样度过:当她回首往事的时候,她不会因为建造环境浪费时间而悔恨,也不会因为浪费而无法这样,...
索引操作 8天学通MongoDB——第三天 细说高级操作 8天学通MongoDB——第二天 细说增删查改 8天学通MongoDB——第一天 基础入门 UML系列(4)团队沟通利器之UML——类图 团队沟通利器之UML—— 序列图 团队沟通利器之...
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插入数据 ...
———————————————————————————————————————————————————————————— —————–今日份复习nodejs—————————- —– Mongodb数据可以介绍 —– ...
近年来,NoSQL数据库已得到了长足的发展,更成为了许多机构追求性能的第一选择,而在这些技术堆栈中,...这里我们为大家分享上海创行科技技术总监严澜的博文——如何搭建高效的MongoDB集群。在大数据的时代,传统的关系
MongoDB是目前非常流行的一种非关系型数据库(NoSQL),因其操作简单、完全免费、源码公开等特点,受到了IT从业人员的青睐,并被广泛...本文教大家8天学通MongoDB——第一天 基础入门篇,感兴趣的朋友一起来了解了解吧
第6 章 MySQL——App 后台最常用的数据库 .. 140 第7 章 Redis——App 后台高性能的缓存系统 . 160 第8 章 MongoDB——App 后台新兴的数据库 .. 185 第9 章 App 后台架构剖析 .. 208 第10 章 App 后台架构的演进 255
作为一个数据库,MongoDB有一个很大的优势——它使用js管理数据库,所以也能够使用js脚本进行复杂的管理——这种方法非常灵活
第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 小结...
超级测试数据库的: MongoDB入门如果我不是 nodemon,请安装项目的 nodemon 全局和本地依赖项: npm install -g nodemonnpm installnpm start运行测试npm test注意:确保 mongodb 正在运行================
backbone是我两年多前入门前端的时候接触到的第一个框架,当初被backbone的强大功能所吸引(当然的确比裸写js要好得多),虽然现在backbone并不算最主流的前端框架了,但是,它里面大量设计模式的灵活运用,以及令人...
第3章 Node.js基础入门.ppt 第4章 异步编程与包管理.ppt 第5章 http模块.ppt 第6章 Web开发中的模板引擎.ppt 第7章 Node.js中的文件操作.ppt 第8章 认识express模块.ppt 第9章 MySQL数据库.ppt 第10章 Express框架....
特别感谢plexsight的精彩教程使用Node.js 构建Web 应用程序涉及的技术本教程结合了几种新兴技术—— 节点JS 表示AngularJS 使用蓝鸟的 Promise API MongoDB(猫鼬) 使用 mocha、chai、karma、phantomjs、supertest...
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-...
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-...