`

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
分享到:
评论

相关推荐

    读书笔记:《左手MongoDB右手Redis——从入门到商业实战》书籍配套源代码。.zip

    读书笔记:《左手MongoDB右手Redis——从入门到商业实战》书籍配套源代码。

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

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

    NoSQL介绍PPT

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

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

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

    MongoDB基础教程

    MongoDB提供了强大的查询语言——MQL(MongoDB Query Language),支持丰富的查询表达式和聚合框架。你可以根据字段、条件进行查询,并使用正则表达式、数组过滤等高级特性。 在性能方面,MongoDB支持索引,可以...

    数据结构算法

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

    MongoDB官网翻译(卷一)——简介.docx

    入门 MongoDB 可以通过官方提供的入门指南,这将引导你了解 MongoDB 的基础操作。遇到技术问题时,社区版用户可以借助 MongoDB 社区论坛寻求帮助,而企业版用户则可以通过专门的技术支持门户提交问题。此外,积极...

    【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插入数据 ...

    Web编程入门——字节跳动.zip

    在这个压缩包中包含的"Web编程入门——字节跳动.pptx"文件,很可能是对这一主题的详细讲解,通过PPT的形式,易于理解和学习。 首先,Web编程的基础是HTML、CSS和JavaScript,这三者构成了网页的基本结构。HTML...

    MongoDB.in.Action.2nd.Edition.2016.3.pdf

    - **分片**:讲解MongoDB的水平扩展技术——分片集群的工作原理及配置步骤。 - **复制集**:探讨复制集在实现高可用性方面的作用,以及如何配置复制集。 - **性能优化** - **索引管理**:如何合理创建和维护索引...

    玩转MongoDB4.0从入门到实践、MongoDB基本操作之CRUD、进阶之聚合、中索引的重要性、数据分片

    ### MongoDB4.0从入门到实践 #### 一、初见MongoDB MongoDB是一款开源的NoSQL数据库系统,以其高性能、高可用性和易用性而受到广泛欢迎。本章节将带您初步了解MongoDB的基本概念和技术特点: 1. **MongoDB简介**...

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

    本教程的目的是在8天内帮助初学者掌握MongoDB的基础知识,第一天主要讲解入门内容。 首先,要开始学习MongoDB,你需要从官方网站下载适合你系统的安装包。MongoDB提供32位和64位版本,32位版本的最大存储限制是2GB...

    MongoDB document

    18. **MongoDB入门指南**(Introduction to MongoDB):这部分可能会提供一个简短的入门教程,帮助读者快速了解MongoDB的基本操作,包括安装、配置、基本查询等。 19. **MongoDB性能优化**(Optimizing MongoDB ...

    .MongoDB.The.Definitive.Guide

    这两个字段虽然内容完全相同,但是指代的是同一本书——《MongoDB: The Definitive Guide》。这是一本详细介绍MongoDB数据库系统的权威指南。 #### 标签解析 - **标签**: "MongoDB.The.Definitive.Guide" 这个标签...

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

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

Global site tag (gtag.js) - Google Analytics