作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Avinash Kaza
Verified Expert in Engineering

Avinash是一名具有设计经验的高级开发人员 & 开发数据可视化.

PREVIOUSLY AT

亚马逊网络服务
Share

Using 数据来回答有趣的问题 研究人员在今天这个数据驱动的世界里忙着做什么. 考虑到海量的数据, the challenge of processing and analyzing it is a big one; particularly for statisticians or data analysts who do not have the time to invest in learning business intelligence platforms or technologies provided by Hadoop eco-system, Spark, 或者NoSQL数据库,这些数据库可以帮助他们在几分钟内分析数tb的数据.

今天的标准是研究人员或统计学家在分析软件包中的数据子集上构建他们的模型 R, MATLAB, or Octave, 然后将公式和数据处理步骤提供给IT团队,然后IT团队构建生产分析解决方案.

这种方法的一个问题是,如果研究人员在生产中的所有数据上运行他的模型后发现了一些新的东西, 这个过程必须再重复一遍.

如果研究人员可以用一个 MongoDB开发人员 然后对所有的生产数据进行分析,并将其作为他的探索性数据集, 无需学习任何新技术或复杂的编程语言, or even SQL?

Mongodb和商业智能

If we use MongoDB的聚合管道 and MEAN 实际上,我们可以在相当短的时间内实现这一目标. 通过本文和可用的代码 在这个GitHub存储库中,我们想展示实现这一点是多么容易.

市场上的大多数商业智能工具都为研究人员提供了从NoSQL和其他大数据技术导入数据集的方法, 然后在工具内部完成转换和分析. 但是在这个商业智能教程中,我们将使用MongoDB聚合管道的功能,而不需要从MongoDB中提取数据, 研究人员正在使用一个简单的接口在生产大数据系统上进行各种转换.

用于商业智能的MongoDB聚合管道

Simply put, MongoDB的聚合管道是一个框架,用于在数据集上执行一系列数据转换. 第一阶段将整个文档集合作为输入, 从那时起,每个后续阶段都将前一个转换的结果集作为输入,并产生一些转换后的输出.

在聚合管道中可以使用10种类型的转换:

  • $geoNear:按离指定点最近到最远的顺序输出文档

  • $match:过滤由任何给定表达式设置的输入记录

  • $project:创建一个包含输入字段或计算字段子集的结果集

  • $ react:根据文档中的信息限制文档的内容

  • $unwind:从文档中获取一个包含n个元素的数组字段,并返回n个文档,其中每个元素作为替换该数组的字段添加到每个文档

  • $group:按一个或多个列进行分组,并对其他列进行聚合

  • $limit:从输入集中挑选前n个文档(用于百分位数计算等).)

  • $skip:忽略输入集中的前n个文档

  • $sort:根据给定的对象对所有输入文档进行排序

  • $out:获取前一阶段返回的所有文档,并将它们写入集合

除了上面列表中的第一个和最后一个, 没有规则规定这些转换的应用顺序. $out只能使用一次, and at the end, 如果要将聚合管道的结果写入新的或现有的集合. $geoNear只能用作管道的第一阶段.

为了让事情更容易理解, 让我们浏览两个数据集以及与这些数据集相关的两个问题.

职务薪金差异

为了解释MongoDB聚合管道的强大功能, 我们下载了一个数据集,其中有整个美国大学教学人员的工资信息. 此数据可在 nces.ed.gov. 我们有来自7598个机构的数据,包括以下领域:

var教员模式=猫鼬.Schema({
	机构名称:字符串,
	AvgSalaryAll:数字,
	教授:人数,
	助理教授:人数;
	助教:人数;
	讲师:人数;
	教官:人数,
	StreetAddress:字符串,
	City : String,
	状态:字符串;
	邮编:字符串,
	人数:人数;
	女员工人数:人数
}

有了这些数据,我们想找出(平均)各州副教授和教授之间的工资差异. Then, 副教授可以意识到他在哪个州的薪水更接近教授.

要回答这个问题, 研究人员首先需要从收集的数据中剔除不良数据, 因为在我们的数据集中有一些行/文档的平均工资是空字符串或空字符串. 为了完成数据集的清理,我们将添加以下阶段:

{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}

这将过滤掉在这两个字段中具有字符串值的所有实体. 在MongoDB中,每种类型都是 用唯一的数字表示的 -对于字符串,类型number为2.

这个数据集是一个很好的例子,因为在现实世界的数据分析中, 工程师也经常需要处理数据清理.

现在我们有了一些稳定的数据, 我们可以继续下一个阶段,我们将按州平均工资:

{$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}

我们只需要运行上述结果集的投影并得到各州平均工资的差异, 如下图所示,我们的管道的第三阶段:

{$project: {_ID: 1, ["$StateAVGSalaryProfessors"], " $ StateAVGSalaryAssociateProfessors ")}}}

这应该能让我们从全美7519所教育机构的数据集中得到教授和副教授之间的州一级平均工资差异. 为了更方便地解释这些信息, 让我们做一个简单的排序,这样我们就可以通过添加一个$sort阶段来知道哪个状态的差异最小:

{$sort: {SalaryDifference: 1}}

从这个数据集中, 很明显爱达荷州, Kansas, 和西弗吉尼亚州是副教授和教授工资差距最小的三个州.

为此生成的完整聚合管道如下所示:

[
{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}},
{$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}},
{$project: {_ID: 1, ["$StateAVGSalaryProfessors"], " $ StateAVGSalaryAssociateProfessors ")}}},
{$sort: {SalaryDifference: 1}}
]

结果显示的数据集如下所示. 研究人员还可以将这些结果导出为CSV,以便使用Tableau等可视化软件包对其进行报告, 或者通过简单的微软Excel图表.

Mongodb数据集示例

按就业类别划分的平均工资

我们将在本文中探讨的另一个示例涉及从 www.data.gov. 已知美利坚合众国所有州和地方政府组织的工资单信息, 我们想算出每个州全职和兼职“财务管理”员工的平均工资.

数据集已经导入,产生了1975个文档,其中每个文档都遵循以下模式:

mongoose.Schema({
	状态:字符串;
	政府函数:字符串,
	全职员工:人数,
	pct:编号,
	FullTimePay:数字,
	兼职员工:人数;
	PartTimePay:数字,
	兼职时间:
	全职同等职位:
	员工总数:人数;
	TotalMarchPay:数字
	}, {collection: 'payroll'});

这个问题的答案可以帮助财务管理人员选择最好的州. 使用我们基于MongoDB聚合器管道的工具,这可以很容易地完成:

在第一阶段, 过滤政府功能列,放弃所有非“财务管理”实体:

{$匹配:{GovernmentFunction:“财务管理”}}

在本教程的下一阶段, 我们将按州对实体进行分组,并计算每个州的全职和兼职平均工资:

{$组:{_id:“美元状态”,FTP_AVG: {$ avg:“FullTimePay美元”},PTM_AVG: {$ avg:“PartTimePay美元”}}}

最后,我们将从高收入州到低收入州对结果进行排序:

{$sort: {FTP_AVG: -1, PTM_AVG: -1}}

这应该允许工具生成以下聚合管道:

[
    {$匹配:{GovernmentFunction:“财务管理”}},
    {$组:{_id:“美元状态”,FTP_AVG: {$ avg:“FullTimePay美元”},PTM_AVG: {$ avg:‘PartTimePay美元}}},
    {$sort: {FTP_AVG: -1, PTM_AVG: -1}}
]

运行聚合管道应该产生如下结果:

Mongodb聚合管道

Building Blocks

为了构建这个商业智能应用程序,我们使用了 MEAN的组合 MongoDB, ExpressJS, AngularJS, and NodeJS.

平均商业智能

您可能已经知道,MongoDB是一个无模式文档数据库. 尽管它存储的每个文档的大小限制为16MB, 它的灵活性和性能以及它提供的聚合管道框架使MongoDB非常适合这个工具. 开始使用MongoDB是非常容易的,由于它的 全面的文档.

Node.js, 平均值的另一个组成部分, 提供事件驱动的服务器端Javascript环境. Node.js使用Google Chrome的V8引擎运行Javascript. Node的可伸缩性承诺.Js是驱动 许多组织 towards it.

Express.js是最流行的Node web应用框架.js. 它可以很容易地为web应用程序构建api或任何其他类型的服务器端业务层. 它非常快,因为它的极简主义性质,但也相当灵活.

AngularJS, 由许多谷歌工程师创建和维护, 正在迅速成为最流行的前端Javascript框架之一.

有两个原因为什么MEAN如此受欢迎,我们选择在techexplorers应用程序开发:

  • 技能组合很简单. 一个懂JavaScript的工程师可以处理所有的层面.

  • 前端、业务和数据库层之间的通信都是通过JSON对象进行的, 这为我们在不同层面的设计和开发节省了大量时间.

Conclusion

在这个MongoDB聚合管道教程中,我们展示了一种经济有效的方法,为研究人员提供了一种工具,他们可以在其中使用生产数据 探索性数据集 运行不同的转换集来分析和构建模型.

我们能够在短短3天内开发和部署这个端到端的应用程序. 这个应用程序是由一个由4名经验丰富的工程师(2名在美国,2名在印度)和1名工程师组成的团队开发的 设计师和自由UX专家 帮助我们对界面设计有一些想法. 在未来的某个时候, 我将花时间解释这种程度的合作是如何在极短的时间内打造出令人惊叹的产品的.

我们希望您利用MongoDB的聚合管道, 把权力交给你们的研究人员,他们可以用他们聪明的分析和洞察力改变世界.

这个应用程序是可以使用的 here.

聘请Toptal这方面的专家.
Hire Now
Avinash Kaza

Avinash Kaza

Verified Expert in Engineering

利斯堡,弗吉尼亚州,美国

2013年11月6日成为会员

作者简介

Avinash是一名具有设计经验的高级开发人员 & 开发数据可视化.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

PREVIOUSLY AT

亚马逊网络服务

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 privacy policy.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 privacy policy.

Toptal开发者

加入总冠军® community.