举例说明什么是MongoDB中的聚合

123 阅读3分钟

数据库管理系统有一些常见的操作,也被SQL和NoSQL数据库所支持。聚合操作是其中之一,并且得到了一些关系型和非关系型数据库的支持。MongoDB是这些数据库中的一个,它支持这种操作。聚合是任何数据库中的一个关键操作,它允许你处理数据记录以获得目标结果。在聚合的帮助下,用户可以通过对数据进行分组,将几个实体合并成一个有意义的实体。

聚合操作由几个表达式组成,有助于对数据进行分组以获得有意义的输出。例如,笔记本电脑、手机、小工具可以合并在一个实体下,比方说technology_store。当单个实体不代表任何东西或没有任何意义时,这些实体就会被合并。

这篇文章提供了对聚合方法和该方法所支持的表达式的深刻见解。

聚合功能在MongoDB中是如何工作的

首先,对于聚合,建议了解聚合函数;该函数的语法提供如下。

> db.collection.aggregate(aggregate-operation)

在这个语法中,"collection"和 "aggregate-operation"是用户定义的。集合"的名称可以是任何东西,"聚合-操作"可以通过使用MongoDB支持的几种聚合表达式来创建。下面列出了一些众所周知的聚合表达式。

  • $sum。这个表达式把文档中某个特定字段的值加起来。
  • $min:从所有文档的相应值中获取最小值。
  • **max。与max**。与min的作用相同,但是,它得到的是最大值。
  • $avg: 这个表达式用于计算集合中给定值的平均值。
  • $last:它返回源文档中的最后一个文档
  • $first: 它用于返回源文件中的第一个文件
  • **push。这个表达式在结果文档中插入值到一个数组中(使用push**。这个表达式在结果文档中插入值到一个数组中(使用push时可能会出现重复的情况)

如何在MongoDB中使用聚合函数

在本节中,我们提供了一些例子,这些例子将帮助你理解MongoDB中聚合的工作。

这个例子中使用的集合名称是 "workers",里面的内容如下所示。

> db.workers.find().pretty()

如输出结果所示,工人有**"姓名"、"职务"、"部门 ""工资 "字段。**

例1:使用$sum表达式

下面的聚合操作将根据相关部门对工人进行分组,并使用**$sum** 表达式来给出每个部门的工人总数。

正如输出显示的那样,该命令根据相关部门对工人进行了分类。

> db.workers.aggregate([{$group: {_id: "$department", Total_Workers: {$sum: 1}}}])

你也可以用其他方式对数据进行分组;比如你想得到工人的数量和他们的职位;你也可以通过使用下面的命令来做到这一点。

像这样的结果对于获得不同职称的工人数量是很有用的。

> db.workers.aggregate([{$group: {_id: "$designation", Total_Workers: {$sum: 1}}}])

例2:使用$avg表达式

在这个例子中,集合与例1中的相同。这里,$avg聚合表达式被用来获取工人 集合中每个部门的平均工资。在我们的例子中,下面的聚合函数将计算出 "写作"和 "视频"部门的工人的平均工资。

> db.workers.aggregate([{$group: {_id: "$department", Average: {$avg: "$salary"}}}])

例3:使用minmin和max表达式

你可以通过在聚合方法中指定**$min**表达式来获得最低工资。下面提到的命令将打印两个部门的工人的最低工资。

> db.workers.aggregate([{$group: {_id: "$department", Min_Salary: {$min: "$salary"}}}])

下面提到的命令将通过对工人的 "指定"分组来检查他们的最高工资。

如前所述,为了计算最大值,使用了**$max**操作。

> db.workers.aggregate([{$group: {_id: "$designation", Max_Salary: {$max: "$salary"}}}])

例4:使用$push表达式

这个例子解释了MongoDB中push与聚合方法的用法。push与聚合方法的用法。push表达式将数据返回为数组值,用于获得分组数据的条件性结果。在这个例子中,我们使用的是集合 "tech_store",下面的内容位于其中。

> db.tech_store.find()

这个集合包含了一些产品和它们的到期日的列表。下面写的命令将执行以下操作。

  • 根据每个产品的到期年份对数据进行分组。
  • 使用$push操作推送每一年的文件。
> db.tech_store.aggregate([{$group: {_id: {Expiry: { $year: "$Expiry"}}, itemstoexpire: {$push: {Product: "$Product", Quantity: "$Qty" }}}}]).pretty()

例5:使用firstfirst和last表达式

还有两个表达式**(firstfirst**和**last**)可以在聚合方法中使用。为了练习这些方法,我们将使用一个包含以下文档的 "laptops"集合。

> db.laptops.find()

**firstfirst**:first操作符用于打印分组数据中的最后一个值。例如,下面写的命令将根据 "产品"字段对数据进行分组,然后$first操作符显示要过期的项目

> db.laptops.aggregate([{$group: {_id: "$Product", itemstoexpire: {$first: "$Expiry" }}}]).pretty()

last。通过使用last**。通过使用**last,你可以检查分组数据中任何字段的最后值。例如,下面提到的命令将对 "产品"字段的数据进行分组,然后使用**$last**操作符来获得每个产品的到期日(发生在最后)。

> db.laptops.aggregate([{$group: {_id: "$Product", itemstoexpire: {$last: "$Expiry" }}}]).pretty()

结论

MongoDB有大量的函数可用来对完整的集合或集合中的特定文档进行特定操作。聚合函数通常用于通过对数据进行分组来获取集合的计算结果,以获取有意义的实体。在这篇内容丰富的文章中,你将学习MongoDB中聚合概念的基础知识以及聚合中使用的表达式。最后,我们将通过一些聚合的例子来展示MongoDB中聚合函数的实现,并对其表达式进行练习。