MongoDB 数据库 聚合管道中$group分组操作的语法详解

MongoDB 数据库阿木 发布于 2025-07-07 9 次阅读


MongoDB 聚合管道中 $group 分组操作的语法详解

MongoDB 是一个高性能、可扩展的文档存储系统,它提供了丰富的查询和聚合功能。聚合管道是 MongoDB 中用于处理和转换数据的一种强大工具,它允许用户将多个操作串联起来,以实现复杂的数据处理任务。在聚合管道中,$group 操作是一个核心的步骤,它允许用户将文档分组并计算每个组的聚合值。

本文将深入探讨 MongoDB 聚合管道中 $group 分组操作的语法,包括其基本用法、参数、以及一些高级应用。

$group 操作简介

$group 操作是聚合管道中的一个阶段,它将输入的文档分组,并对每个组执行一系列的聚合操作。每个输入文档都会被传递到 $group 阶段,并根据指定的键(key)进行分组。对于每个分组,可以计算各种聚合值,如总和、平均值、最大值、最小值等。

$group 语法详解

基本语法

javascript

{ $group: {


_id: <expression>,


<expression1>: { <accumulator>: <expression> },


<expression2>: { <accumulator>: <expression> },


...


} }


- `_id`: 分组的键,可以是字段名、表达式或常量。如果 `_id` 被省略,则每个文档都会被分配到一个新的组中,并且每个组的 `_id` 为 `null`。

- `<expression>`: 用于计算 `_id` 的表达式。

- `<accumulator>`: 聚合器,用于计算每个组的聚合值。

- `<expression>`: 聚合器中使用的表达式。

聚合器

MongoDB 提供了多种聚合器,以下是一些常用的聚合器:

- `_id`: 返回文档的键值。

- `$sum`: 计算总和。

- `$avg`: 计算平均值。

- `$max`: 返回最大值。

- `$min`: 返回最小值。

- `$push`: 将值添加到数组中。

- `$first`: 返回第一个值。

- `$last`: 返回最后一个值。

示例

假设我们有一个名为 `orders` 的集合,其中包含以下文档:

json

{


"_id": 1,


"order_id": "A1",


"customer_id": "C1",


"amount": 100


},


{


"_id": 2,


"order_id": "A2",


"customer_id": "C1",


"amount": 200


},


{


"_id": 3,


"order_id": "A3",


"customer_id": "C2",


"amount": 150


}


以下是一个使用 $group 操作的示例,它按 `customer_id` 分组,并计算每个客户的订单总数和平均金额:

javascript

db.orders.aggregate([


{ $group: {


_id: "$customer_id",


total_orders: { $sum: 1 },


total_amount: { $sum: "$amount" },


average_amount: { $avg: "$amount" }


}}


])


这将返回以下结果:

json

{


"_id": "C1",


"total_orders": 2,


"total_amount": 300,


"average_amount": 150


},


{


"_id": "C2",


"total_orders": 1,


"total_amount": 150,


"average_amount": 150


}


高级应用

使用数组

$group 操作可以与 `$push` 聚合器结合使用,将多个值推送到数组中。

javascript

db.orders.aggregate([


{ $group: {


_id: "$customer_id",


order_ids: { $push: "$order_id" },


total_amount: { $sum: "$amount" }


}}


])


使用条件聚合

可以使用 `$cond` 聚合器在 $group 阶段进行条件聚合。

javascript

db.orders.aggregate([


{ $group: {


_id: "$customer_id",


total_amount: { $sum: "$amount" },


high_value_orders: { $push: { $cond: [{ $gt: ["$amount", 100] }, "$order_id", null] } }


}}


])


使用 `$sort` 和 `$limit`

在 $group 阶段之后,可以使用 `$sort` 和 `$limit` 来对结果进行排序和限制。

javascript

db.orders.aggregate([


{ $group: {


_id: "$customer_id",


total_amount: { $sum: "$amount" }


}},


{ $sort: { total_amount: -1 } },


{ $limit: 5 }


])


总结

$group 操作是 MongoDB 聚合管道中一个强大的工具,它允许用户对数据进行分组和聚合。通过理解 $group 的语法和聚合器,可以创建复杂的查询来处理和分析数据。本文详细介绍了 $group 操作的语法,并通过示例展示了其应用。通过学习和实践,用户可以更好地利用 MongoDB 的聚合功能来处理数据。