使用 MongoDB 按多个字段对值进行分组

MongoDB 按多个字段分组用于使用各种方法按多个字段对值进行分组。

对 MongoDB 文档中存在的各种字段进行分组的最有效方法之一是使用 $group 运算符,它有助于在分组数据上执行多个其他聚合函数。

本文将讨论在 MongoDB 中使用运算符按文档内的多个字段对值进行分组的多种方法。它还将查看与聚合一起使用的运算符列表,以及如何借助示例来实现它们。

MongoDB 中的 $group 运算符

MongoDB 的 $group 运算符对几个聚合字段的输入和输出只不过是数据库的书面记录。它接受单个文档并返回一个或多个文档。

在对各个字段进行分组时,你可以使用各种运算符,如下所述。

  1. $first – 仅从一组文档中提取第一个文档,通常在排序时使用。
  2. $push – 在结果字段中插入一个字段的新值。
  3. $last – 最后在结果字段中插入一个字段的新值。
  4. $addToSet – 有助于在不发生任何重复的情况下向数组的现有值添加新值。
  5. $min – 此运算符帮助从提供和传递的整数值中查找并返回最小整数或最小值。
  6. $avg – 计算字段之间所有指定数值的平均值。
  7. $max – 帮助从提供和传递的整数值中查找并返回最重要的整数值或最大值。
  8. $sum – 它将计算所有指定数值的总和。

聚合管道

POSIX 模式设置为 true 时,在 MongoDB 中对字段进行分组的另一种方法是使用管道。使用聚合物管功能,你可以过滤出符合聚合管道标准的文档。

为聚合管道的每个级别定义阶段运算符。阶段运算符可以在内部使用表达式运算符在每个级别阶段之前进行换行,甚至可以计算平均值或求和或连接特定值。

聚合管道的输出被视为最终要返回的输出,如果需要,它甚至可以存储在集合中。

处理流程

对多个字段进行分组的另一种方法是使用处理流。你可以使用 Db.collection.aggregate() 函数使用各种通道同时处理数据。

Db.collection.aggregate() 函数在内部进行聚合并为要使用的多个操作提供支持。

Db.collection.aggregate() 函数可以有效地用于一系列切片,而不会导致数据丢失。函数 Db.collection.aggregate() 返回存储在内存中的数据作为游标,可以直接用作 MongoShell

MongoDB 中的 $group 运算符示例

你可以在本文中使用以下集合。

db={"invoice":[{"_id":1,"item":"apple","qty":20,"rate":10,"inv_date":"02/02/2020"},{"_id":2,"item":"orange","qty":15,"rate":8,"inv_date":"05/12/2020"},{"_id":3,"item":"mango","qty":25,"rate":8,"inv_date":"07/02/2020"},{"_id":4,"item":"apple","qty":20,"rate":10,"inv_date":"02/02/2020"},{"_id":5,"item":"mango","qty":10,"rate":8,"inv_date":"05/12/2020"},{"_id":6,"item":"apple","qty":30,"rate":10,"inv_date":"13/04/2020"},{"_id":7,"item":"orange","qty":15,"rate":8,"inv_date":"05/12/2020"},{"_id":null,"item":"banana","qty":10,"rate":20,"inv_date":"17/12/2020"},]}

以下示例按发票日期字段分组,并显示同一日期的总成本、平均数量和发票数量。

db.invoice.aggregate([{$group:{_id:"$inv_date",totalCost:{$sum:{$multiply:["$rate","$qty"]}},avgQty:{$avg:"$qty"},count:{$sum:1}}}])

结果显示字段发票日期的文档已分组,并显示该日期的总成本、平均数量以及开出的发票数量。

使用 MongoDB 按多个字段对值进行分组

$group 关于 MongoDB 中的多个键

以下示例按发票日期分组,然后按项目字段分组,并显示同一日期的总成本、平均数量和发票数量。

db.invoice.aggregate([{$group:{_id:{inv_date:"$inv_date",item:"$item"},totalCost:{$sum:{$multiply:["$rate","$qty"]}},avgQty:{$avg:"$qty"},count:{$sum:1}}}])

下面的结果显示发票日期 05/12/202002/02/2020 的文档具有相同的项目;这两个领域的组合形成了一个群体。

使用 MongoDB 按多个字段对值进行分组

在 MongoDB 中 $group 使用 $match 的多个键

以下示例按发票日期分组,然后按项目字段分组,并显示发票日期为 05/12/2020 的那些单据在同一日期的总成本、平均数量和发票编号。

db.invoice.aggregate([{$match:{inv_date:"05/12/2020"}},{$group:{_id:{inv_date:"$inv_date",item:"$item"},totalCost:{$sum:{$multiply:["$rate","$qty"]}},avgQty:{$avg:"$qty"},count:{$sum:1}}}])

下面的结果显示发票日期 05/12/2020 的单据有三张发票,但具有相同的项目组合已组成一个组。

使用 MongoDB 按多个字段对值进行分组

MongoDB 中的 $group 区别值

以下聚合操作使用 $group 阶段按项目对文档进行分组,以检索不同的项目值。

db.invoice.aggregate([{$group:{_id:"$item"}}])

输出显示在下面的屏幕截图中。

使用 MongoDB 按多个字段对值进行分组

在 MongoDB 中 $group 阶段对发票日期进行分组

以下聚合操作使用 $group 阶段按项目对文档的发票日期进行分组。

db.invoice.aggregate([{$group:{_id:"$item",invoiceDate:{$push:"$inv_date"}}}])

下面的截图是输出。

使用 MongoDB 按多个字段对值进行分组

本文教你使用 $group 运算符对 MongoDB 文档中存在的多个字段进行分组的最有效方法。

它还讨论了在 MongoDB 中使用运算符的所有多种形式以及与聚合一起使用的运算符列表,以及如何在示例的帮助下实现它们。