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

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 本节书摘来自华章社区《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
相关文章
|
7月前
|
JSON NoSQL MongoDB
mongodb基本操作,增删改查,查询,索引,权限机制
mongodb基本操作,增删改查,查询,索引,权限机制
|
7月前
|
SQL NoSQL 关系型数据库
MongoDB复杂分组聚合查询1
MongoDB复杂分组聚合查询1
412 0
|
6月前
|
NoSQL MongoDB 索引
开心档-软件开发入门之MongoDB 覆盖索引查询
开心档-软件开发入门之MongoDB 覆盖索引查询
45 0
|
3月前
|
NoSQL 关系型数据库 MySQL
深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
在 MongoDB 中,我们使用 find() 和 find_one() 方法来在集合中查找数据,就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样
63 1
|
5月前
|
NoSQL JavaScript MongoDB
mongodb语法
mongodb语法
|
3月前
|
存储 NoSQL 安全
go 连接mongodb执行查询的代码
在Go语言中,你可以使用官方的MongoDB驱动程序 `"go.mongodb.org/mongo-driver/mongo"` 来连接MongoDB并执行查询。以下是一个简单的示例代码,演示如何连接MongoDB并执行查询: 首先,确保你已经安装了MongoDB驱动程序: ```bash go get go.mongodb.org/mongo-driver/mongo ``` 然后,可以使用以下示例代码: ```go package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driv
|
4月前
|
存储 NoSQL MongoDB
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐!
4837 1
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
|
4月前
|
缓存 NoSQL MongoDB
MongoDB数据库查询性能提高40倍?
MongoDB数据库查询性能提高40倍?
95 0
|
4月前
|
NoSQL JavaScript 前端开发
MongoDB【CRUD练习-条件查询-文档关系】
MongoDB【CRUD练习-条件查询-文档关系】