《MongoDB管理与开发精要》——3.2节查询语法

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 本节书摘来自华章社区《MongoDB管理与开发精要》一书中的第3章,第3.2节查询语法,作者:红 丸,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.2 查询语法
MongoDB最大的特点是,它支持的查询语言非常强大,其语法类似于面向对象的查询语言,不但可以实现关系型数据库查询的大部分功能,而且还支持对数据建立索引。由于MongoDB可以支持非常复杂的数据结构,同时带有强大的数据查询功能,因此非常受欢迎,很多项目都考虑用MongoDB来替代MySQL等传统数据库来实现复杂的Web应用。很多案例都是因为数据量实在太大,所以迁移到MongoDB上,从而数据查询的速度得到了非常显著的提升。
3.2.1 数组内容的查询
MongoDB本身支持数组类型的内嵌对象,接下来讲解如何查询数组中的特定内容。
数组内容的查询方法跟普通查询方法没有区别,只不过要查询的是数组中的值,而不是单独的值。
例如数据库中的c1表,其中colors列存储的就是一个数组,如下面代码所示:

> db.c1.find()
{ "_id" : ObjectId("4ff00d91a4ea64ce4cafef7b"), "colors" : [ "red", "black" ] }
{ "_id" : ObjectId("4ff00da5a4ea64ce4cafef7c"), "colors" : [ "blue", "yellow" ] }
>
现在要查询colors中有red的记录,可以如下面的代码所示:
> db.c1.find( { colors : "red" } )
{ "_id" : ObjectId("4ff00d91a4ea64ce4cafef7b"), "colors" : [ "red", "black" ] }
>

结果跟我们期望的一样,包含“red”的记录出现了。
3.2.2 内嵌文档的查询
如果某一列存储的不是一个单独的值,而是一条有多个列的记录,这条记录叫做“内嵌文档”。所以查询内嵌文档时,需要将条件细化到列上。
例如,数据库中存在以下内嵌式文档数据,其中author列的值对应的就是内嵌文档。

> db.c2.find()                                                                                          
{ "_id" : ObjectId("4ff00eb1a4ea64ce4cafef80"), 
  "author" : { "name" : "Dan Brown", "age" : 38 }, 
  "book" : "The Lost Symbol" }
{ "_id" : ObjectId("4ff00eeca4ea64ce4cafef81"), 
  "author" : { "name" : "wangwenlong", "age" : 30 }, 
  "book" : "How greate the MongoDB!" }
>
现在查询“author=wangwenlong”的记录,可以如下面的代码所示:
> db.c2.find( { "author.name" : "wangwenlong" } );
{ "_id" : ObjectId("4ff00eeca4ea64ce4cafef81"), 
  "author" : { "name" : "wangwenlong", "age" : 30 }, 
  "book" : "How greate the MongoDB!" }
>

结果跟我们期望的一样,“author”是“wangwenlong”的记录出现了。
注意 查询内嵌对象的属性时,记得要加上引号("")。也就是说,字段是"author.name",而不是author.name。
3.2.3 正则表达式匹配
正则表达式就是用某种模式去匹配一类字符串的一个公式,它由一些普通的字符组成。
接下来讲解如何使用正则表达式来进行模糊查询。例如,查询不匹配“name=B*”开头的记录,如下面的代码所示:

db.users.find({name: {$not: /^B.*/}});

举一个实际的例子,c1表的数据如下面的代码所示:

> db.c1.find();
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }

查询name不以“T”开头的数据如下面的代码所示:

> db.c1.find({name: {$not: /^T.*/}})
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }

可以看出,只显示“name=Tony”的数据,其他不符合规则的数据并没有显示出来。
3.2.4 $where查询
$where查询允许在查询里执行JavaScript表达式。例如查询a大于3的数据,可以用普通的查询方法,如下面的代码所示:
db.c1.find( { a : { $gt: 3 } } );
注意 “$where查询”是指采用类似于SQL中的where语句来进行查询的方式,但命令中并不包含where关键字。
也可以用$where的数值比较符号来查询,如下面的代码所示:
db.c1.find("this.a > 3");
但有一点需要注意,如非必要,尽量不要使用,因为一旦使用,document都必须从BSON转换为一个JavaScript对象,所以$where查询比一般的查询会慢很多。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
28天前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
17天前
|
存储 NoSQL MongoDB
MongoDB 查询分析
10月更文挑战第21天
9 1
|
17天前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
21 1
|
23天前
|
SQL NoSQL MongoDB
MongoDB 查询文档
10月更文挑战第15天
12 1
|
25天前
|
存储 人工智能 NoSQL
使用 MongoDB 构建 AI:Gradient Accelerator Block 如何在几秒钟内让您从零开发 AI
借助 MongoDB,开发者可以存储任何结构的数据,然后使用单一查询 API 和驱动程序将这些数据用于 OLTP、文本搜索和向量搜索处理。
|
25天前
|
人工智能 NoSQL 机器人
MongoDB Atlas与YoMio.AI近乎完美适配:推理更快速、查询更灵活、场景更丰富
随着MongoDB的新发布和革新,YoMio.AI的“闪电式发展”值得期待。
|
5月前
|
JSON NoSQL MongoDB
Rockmongo详解:高效管理MongoDB的图形化利器
Rockmongo详解:高效管理MongoDB的图形化利器
108 0
|
5月前
|
NoSQL 定位技术 MongoDB
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
|
2月前
|
SQL NoSQL JavaScript
04 MongoDB各种查询操作 以及聚合操作总结
文章全面总结了MongoDB中的查询操作及聚合操作,包括基本查询、条件筛选、排序以及聚合管道的使用方法和实例。
73 0
|
3月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
58 3