商业智能平台:使用 MongoDB 聚合管道的教程

已发表: 2022-03-11

使用数据来回答有趣的问题是研究人员在当今数据驱动的世界中忙于做的事情。 鉴于海量数据,处理和分析数据的挑战很大; 特别是对于没有时间投资学习商业智能平台或 Hadoop 生态系统、Spark 或 NoSQL 数据库提供的技术的统计学家或数据分析师,这些平台或技术将帮助他们在几分钟内分析 TB 级数据。

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

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

如果研究人员可以与 MongoDB 开发人员合作,对所有生产数据进行分析并将其用作他的探索性数据集,而无需学习任何新技术或复杂的编程语言,甚至 SQL 会怎样?

MongoDB和商业智能

如果我们有效地使用 MongoDB 的聚合管道和 MEAN,我们可以在相当短的时间内实现这一目标。 通过这篇文章和这个 GitHub 存储库中可用的代码,我们想展示实现这一点是多么容易。

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

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

简单来说,MongoDB 的聚合管道是一个对数据集执行一系列数据转换的框架。 第一阶段将整个文档集合作为输入,然后每个后续阶段将先前转换的结果集作为输入并产生一些转换后的输出。

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

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

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

  • $project:使用输入字段或计算字段的子集创建结果集

  • $redact:根据来自文档的信息限制文档的内容

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

  • $group:按一列或多列分组并在其他列上执行聚合

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

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

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

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

除了上面列表中的第一个和最后一个,没有关于这些转换可以应用的顺序的规则。 $out 应该只使用一次,最后,如果我们想将聚合管道的结果写入新的或现有的集合。 $geoNear 只能用作管道的第一阶段。

为了让事情更容易理解,让我们来看看两个数据集和与这些数据集相关的两个问题。

不同职位的薪金差异

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

 var FacultySchema = mongoose.Schema({ InstitutionName : String, AvgSalaryAll : Number, AVGSalaryProfessors : Number, AVGSalaryAssociateProfessors : Number, AVGSalaryAssistantProfessors : Number, AVGSalaryLecturers : Number, AVGSalaryInstructors : Number, StreetAddress : String, City : String, State : String, ZIPCode : String, MenStaffCount : Number, WomenStaffCount : Number }

有了这些数据,我们想(平均而言)找出各州副教授和教授的工资之间的差异。 然后,副教授可以意识到他在工资方面更接近教授的价值。

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

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

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

这个数据集就是一个很好的例子,因为在现实世界的数据分析中,工程师通常还必须处理数据清理。

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

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

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

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

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

 {$sort: { SalaryDifference: 1}}

从这个数据集中,很明显,爱达荷州、堪萨斯州和西弗吉尼亚州是三个州,副教授和教授的工资差异与所有其他州相比最小。

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

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

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

mongodb 数据集示例

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

我们将在本文中探讨的另一个示例涉及从 www.data.gov 获得的数据集。 鉴于美利坚合众国所有州和地方政府组织的工资单信息,我们想计算出每个州全职和兼职“金融管理”员工的平均工资。

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

 mongoose.Schema({ State : String, GovernmentFunction : String, FullTimeEmployees : Number, VariationPCT : Number, FullTimePay : Number, PartTimeEmployees : Number, PartTimePay : Number, PartTimeHours : Number, FullTimeEquivalentEmployment : Number, TotalEmployees : Number, TotalMarchPay : Number }, {collection: 'payroll'});

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

在第一阶段,过滤 GovernmentFunction 列以丢弃所有非“金融管理”实体:

 {$match:{GovernmentFunction:'Financial Administration'}}

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

 {$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}

最后,我们将结果从高薪州排序到低薪州:

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

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

 [ {$match:{GovernmentFunction:'Financial Administration'}}, {$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}, {$sort: {FTP_AVG: -1, PTM_AVG: -1}} ]

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

mongodb聚合管道

建筑模块

为了构建这个商业智能应用程序,我们使用了 MEAN,它是 MongoDB、ExpressJS、AngularJS 和 NodeJS 的组合。

MEAN 商业智能

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

Node.js 是 MEAN 的另一个不可或缺的组件,它提供了事件驱动的服务器端 Javascript 环境。 Node.js 使用 Google Chrome 的 V8 引擎运行 Javascript。 Node.js 的可扩展性承诺是推动许多组织走向它的原因。

Express.js 是 Node.js 最流行的 Web 应用程序框架。 它使为 Web 应用程序构建 API 或任何其他类型的服务器端业务层变得容易。 由于其极简主义的性质,它非常快,但也非常灵活。

由许多 Google 工程师创建和维护的 AngularJS 正迅速成为可供我们使用的最流行的前端 Javascript 框架之一。

MEAN 如此受欢迎以及我们选择 techXplorers 应用程序开发的原因有两个:

  • 技能组很简单。 了解 JavaScript 的工程师适合所有层级。

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

结论

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

我们能够在短短 3 天内端到端地开发和部署这个应用程序。 该应用程序由 4 名经验丰富的工程师(2 名在美国,2 名在印度)和一名设计师和自由 UX 专家组成的团队开发,帮助我们对界面设计提出一些想法。 在未来的某个时候,我将花时间解释这种级别的协作如何在令人难以置信的短时间内构建出令人敬畏的产品。

我们希望您利用 MongoDB 的聚合管道,将权力交到您的研究人员手中,他们可以通过聪明的分析和洞察力改变世界。

此应用程序可在此处使用。