MongoDB 中的文档操作与关系型数据中的增删改查,没什么两样,只是形式不同而已。,集合操作,我们在创建集合时,还可以指定一些可选的选项。如下表所示:,
,一个例子:,一个插入多个文档的例子:,接着查看集合:,前面的内容是关于如何创建集合及创建文档,接下来的篇幅将要介绍文档的查询。准备测试数据:,find 的语法为:,下面是一些具体的示例:,可以使用 findOne() 方法查询一条文档:,查询指定的文档:,我们可以用任何一种方式来做:“title” 或 title。JSON 规范是将名称(对象名称-值对)包含在双引号中。,and 与 or 还可以一起使用。下面是一些具体的示例:,还可以使用 regex 以支持正则。示例如下:,该函数可以美化输出。示例如下:,
,update 的语法为:,示例如下:,update 示例如下:,update 方法有很多选项可供选择,可以参考官网的链接进行查看:https://docs.mongodb.com/manual/reference/method/db.collection.update/。这里演示其中一个选项:,更详细的请查看官方文档:https://docs.mongodb.com/manual/tutorial/query-documents/。,不加任何条件限制,将会删除所有。示例如下:,检索部分文档,如只检索某些字段。,_id 字段是默认显示的,如果不想显示,可以把该字段关闭,设置为 0 即可。如下:,限制返回的文档数。准备数据:,语法为:,接下来看具体的示例:,在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。文档排序的语法为:,下面是具体的示例:,对 title 字段进行升序排序:,索引通常可以提供查询的效率。如果没有索引,MongoDB 在读取数据时需要扫描集合中每个文件并根据条件查询符合要求的文档。,创建索引的语法为:,关于索引的更多操作,可以参考官网文档:https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/#db.collection.createIndex。,类似 SQL 里的 GROUP BY,WHERE、JOIN 等功能。整个聚合运算过程称为管道(Pipeline),它由多个步骤(Stage)组成。管道做如下事情:,下表是 SQL 的命令与 MongoDB 聚合框架的对比:,聚合操作处理数据记录并返回计算结果。聚合操作将多个文档的值分组在一起,并且可以对分组数据执行各种操作以返回单个结果。MongoDB 提供了三种执行聚合的方法:聚合管道、映射还原函数和单一目的聚合方法。,如果我们要查询文档的数量,可以使用 count()。,示例如下:,下面给出几组 MQL 与 SQL 的对比,这样理解及记忆起来会更加深刻:,那么对应的 SQL 该怎么写呢?如下:,我们这里只给出这一个例子,对于其他的查询,我们应该可以轻松的实现。,聚合管道可以实现更复杂的查询。MongoDB 的聚合框架以数据处理管道的概念为模型。文档进入多步骤管道,将文档转换为聚合结果。最基本的管道步骤提供过滤器,就像查询和文档转换一样,修改文档输出的形式。,其他管道操作提供了按特定字段对文档进行分组和排序的工具,以及聚合数组内容的工具,包括文档数组。此外,管道步骤可以使用运算符来计算平均值或串联字符串等任务。,下面通过一个流程图来说明:,
,该管道分为 3 个步骤:,MongoDB 中的聚合管道很类似 Unix 中的管道。,我们先看一个简单的例子:,我们针对订单状态为 "A" 的订单,对其进行一个分组聚合:,一个管道中的步骤可以写在一起,也可以分开写。如下图所示:,这里给出一个具体的示例:,我们还可以把每个步骤分开写,最后放到一个列表里,这样看起来会更清晰。具体使用上面或下面这种形式,还是要看个人口味,没有绝对的好与坏。,接下来就准备一些演示用的文档。如下:,根据指定的表达式和存储区边界将传入的文档分类为多个组,称为存储桶,并为每个存储桶输出一个文档。,场景:有一个名为 oscars 的集合,我们要对该集合中电影的年代进行统计。如:处于 1920 ~ 1940 这个年代的有多少电影。这时就可以用到 $bucket 了,示例如下:,用于把文档中的数组展开。示例如下:,我们可以看到上述文档中包含了一个 tags 这样的一个数组,接下来我们要对其进行展开:,大家可以参考这个链接 https://docs.mongodb.com/manual/reference/built-in-roles/ 查看 MongoDB 内置的角色。如果不清楚有哪些内置的角色,可以使用命令节能型查看:,我们这里介绍一下 root 权限。其中 root 角色包含下面几个角色:,接下来创建的用户 test 对 db store 具有读写权限。操作如下:,阿里云的 MongoDB,需要使用使用 3.0 版本以上的客户端才能连接成功,否则会出现鉴权失败,登录时请使用管理员账户进行登录。接着安装 pymongo。,基本的登录代码如下:,为了在实验中使用 MongoDB,我们先启动一个临时 mongod 实例:,以上指令将使用 /data 作为数据目录(如果不存在请创建),在默认端口 27017 启动一个临时 mongod 实例。,在使用 MongoDB 之前必须先安装用于访问数据库的驱动程序。这里我们以 Python 为例给大家演示:,在 python 交互模式下导入 pymongo,检查驱动是否已正确安装:,使用驱动连接到 MongoDB 集群只需要指定 MongoDB 连接字符串即可。其基本格式可以参考文档: Connection String URI Format,连接字符串的大部分参数在不同编程语言之间是通用的。本实验中,我们使用以下连接字符串:,这里指定了连接池保持连接的最小数量是 10,最大连接数 100。要连接到 MongoDB,在 Python 交互模式下执行以下语句即可:,在上述过程中创建MongoClient后,我们将使用它来完成CRUD操作。假设我们将使用foo数据库的bar集合来完成测试:,我们将结果查询出来看看是否正确:,我们可以注意到这个对象上添加了一个_id,它是MongoDB对每个对象赋予的唯一主键,如果没有指定则由系统自动分配一个ObjectId来填充。,现在我们尝试对刚才的文档进行一点修改,然后再查询它:,最后我们将它从表中删除:,除了在 Python 交互模式下执行,我们当然也可以将代码放在一个文件中执行。把等价的代码放到文件中:,执行这个文件:,我们将得到跟之前相同的结果。接下来我们使用 Python 代码演示聚合查询:,执行上述代码:,本篇我们介绍了 MongoDB 常用的文档查询相关内容。此篇涉及的内容较多,需要多动手实践,方能记忆深刻。我们可以结合前篇文章中关于 SQL 及 MongoDB 的对照表进行对比着学习,这里再次列出来供参考。如下:,
,
,
© 版权声明
文章版权归作者所有,未经允许请勿转载。