如何使用PyMongo在MongoDB数据库中创建聚合管道
我们将在MongoDB中讨论聚合管道。
我们将看到如何使用匹配,组,存储桶和构面等运算符。
介绍
MongoDB是一个非结构化数据库,以文档形式存储数据。此外,MongoDB能够非常高效地处理大量数据,并且是使用最广泛的NoSQL数据库,因为它提供了丰富的查询语言以及对数据的灵活而快速的访问。
MongoDB中的聚合管道
在本文中,我们将看到有关如何使用PyMongo在MongoDB数据库中创建聚合管道的多个示例。此外,我们将看到如何使用诸如match之类的运算符来过滤数据,如何使用存储区在字段上创建用户定义的存储区,如何在一组文档上创建多个管道。
这是MongoDB系列文章中的第三篇。我在下面的系列文章中列出了前2篇文章-
适用于初学者的Python教程中的MongoDB
如何使用PyMongo查询MongoDB数据库?
因此,如果您是MongoDB的完整入门者,我建议您在开始之前先阅读该文章。
目录
什么是PyMongo?
安装步骤
将数据插入数据库
什么是聚合管道?
比赛
组
桶
刻面
尾注
什么是PyMongo?
PyMongo是一个Python库,使我们能够与MongoDB连接。此外,这是与MongoDB和Python一起使用的最推荐方法。
另外,我们选择Python与MongoDB进行交互,因为它是数据科学中最常用且功能最强大的语言之一。PyMongo允许我们使用类似于字典的语法来检索数据。
如果您是Python的初学者,我建议您参加此免费课程:Python入门
现在让我们看看如何使用PyMongo在MongoDB数据库中创建聚合管道。
安装步骤
安装PyMongo非常简单明了。在这里,我假设您已经安装了Python 3和MongoDB。以下命令将帮助您安装PyMongo:
pip3安装pymongo
将数据插入数据库
我们将使用与上一篇文章相同的数据。如果您已经拥有它,则可以跳到下一部分。
导入库并连接到mongo客户端
在您的机器上启动MongoDB服务器。我假设它正在localhost:27017运行文件。
让我们从导入一些我们将要使用的库开始。默认情况下,MongoDB服务器在本地计算机上的端口27017上运行。然后,我们将使用pymongo库连接到MongoDB客户端。
然后获取数据库sample_db的数据库实例。万一它不存在,MongoDB将为您创建一个。
从JSON文件创建集合
我们将使用在多个城市运营的送餐公司的数据。此外,他们在这些城??市设有各种配送中心,用于将餐单发送给客户。您可以在此处下载数据和代码。
weekly_demand:
id:每个文档的唯一ID
周:周号
center_id:配送中心的唯一ID
meal_id:膳食的唯一ID
checkout_price:最终价格,包括折扣,税金和送货费
base_price:餐的基本价格
emailer_for_promotion:发送电子邮件以促进进餐
homepage_featured:首页提供的餐点
num_orders:(目标)订单数
将数据插入收藏夹
现在,我们拥有的数据为JSON格式。然后,我们将获得集合的实例,读取数据文件,并使用insert_many函数插入数据。
https://gist.github.com/lakshay-arora/7a86d0bafe8b43d51e0dfcfd02b6f80a#file-collection_2-py
什么是聚合管道?
在聚合操作中,将处理数据并返回计算结果。在这里,聚合管道为您提供了一个聚合数据的框架,并且建立在数据处理管道的概念之上。以下是其语法:
your_collection 。聚合( [ { < stage1 > }, {<stage2>},.. ] )
聚合管道包含多个阶段。管道中的每个阶段都会在文件通过管道时对其进行转换。让我们来看看这些阶段-
比赛
该比赛阶段一般用于过滤的文件,它是在管道的起点大多发生。它具有以下语法:
{ $ match : { <查询> } }
我们应该将匹配阶段尽早放入管道中,因为它将过滤文档,并且匹配运算符也将能够利用索引。
在下面的示例中,在第一阶段,我们将过滤center_id为11的文档,在第二阶段,我们将计算剩余的文档数。
MongoDB中的聚合管道-总行数
让我们看另一个示例,在第一阶段中,我们将过滤文件,其center_id为11,现在从过滤的文件中,我们找出结账价格大于130而小于140的文件。在最后阶段,我们将计算剩余的文档总数。
MongoDB中的聚合管道-总行数
组
下一个聚合运算符是组运算符。如果您使用过熊猫,您可能已经看到我们通常使用groupby来基于特定字段查找统计信息。例如,员工部门明智的平均工资,每家商店出售的独特商品的数量等。
以下是其语法:
{
$ group:
{
_id:<表达式>,//按表达式分组
<field1>:{<accumulator1>:<expression1>},
...
}
}
如果将_id的值设置为“ None”或任何恒定值(如0),它将在文档中存在的所有字段上计算汇总结果,而不是对任何特定字段上的数据进行分组。在下面的示例中,我们将在第一阶段中找出center_id为11的所有文档。在第二阶段,如果我们将_id设为0,则它??将考虑所有文档并返回结果。
让我们看下面的代码:
MongoDB中的聚合管道-组
此外,在同一组运算符中,我们可以添加不同的累加器,例如$ avg,$ sum,$ first,$ last等。在MongoDB文档上查看完整列表。
让我们看下面的例子。它将计算center_id 11的总结账价格和平均结账价格。
MongoDB中的聚合管道-组
让我们再举一个例子,我们将数据分组在homepage_featured字段上。它将返回给我们指定字段“ homepage_featured”中存在的不同类别。
MongoDB中的聚合管道-组
在前面的示例中,我们发现在中心ID为11的所有文档中分别有2个类别0和1。现在,我们将看到这两个类别的平均结帐价格-
MongoDB中的聚合管道-组
然后,让我们看看如何对多个字段进行分组。例如,您需要计算每个部门和每个性别的雇员的平均工资。在“ _id”对象中,只需按希望分组数据的顺序提供字段即可。
在以下示例中,首先将匹配具有center_id 11的文档,并针对电子邮件促销和首页精选功能的所有组合,计算出平均结账页面。
组
桶
该桶操作人员把文档分成多个组,然后做的操作。以下是其语法:
{
$ bucket:{
groupBy:<表达式>,
边界:[<lowerbound1>,<lowerbound2>,...],
默认值:name_of_the_label,
输出:{
<输出1>:{<$累加器表达式>},
...
<outputN>:{<$ accumulator表达式>}
}
}
}
您需要提供您具有groupby的字段以及存储桶的边界,如果万一文档没有位于任何存储桶中,您还可以将其放在默认存储桶中。此外,在输出对象中,您可以定义每个存储桶所需的统计信息。
在以下示例中,将在字段checkout_price上创建7个不同的存储桶,对于每个存储桶,我们将计算文档总数和平均订单数。
桶
刻面
它是聚合管道中最重要的运算符之一。它将允许您在同一组文档上创建多个聚合管道。构面中的每个管道都会给出自己的输出。以下是其语法:
{
$ facet :
{
< output_field_name_1 >: [ < stage1 > , < stage2 > , ... ],
< output_field_name_2 >: [ < stage1 > , < stage2 > , ... ],
...
}
}
构面内的每个管道都将获得完全相同的文档集。每条管线完全独立。
在这里,在此示例中,我们将在构面中添加两个聚合管道。在第一个管道中,我们将找出电子邮件促销和首页特色的每种组合的平均结账价格。在第二个管道中,我们将在结帐价格上创建存储桶,并找出每个存储桶中的平均订单数。
题库