MongoDB 中的聚合 (Aggregation) 操作详解

在 MongoDB 中,聚合 (Aggregation) 操作是一种非常强大的数据处理方式,可以帮助我们对文档进行高效、灵活的计算和分析。本文将详细介绍 MongoDB 中的聚合操作,包括聚合框架、管道操作符、聚合表达式等内容,并提供实际的示例代码,帮助读者更好地理解和应用这一技术。

一、聚合框架

MongoDB 中的聚合操作采用了类似于 SQL 中的 GROUP BY 操作的思想,将文档按照指定的字段进行分组,然后对每个分组进行计算或者其他操作,最终得到一个结果集。聚合操作的基本结构如下所示:

--------------------------------- ---------

其中,pipeline 是一个由多个聚合操作符组成的数组,用于指定聚合的具体过程;options 是一个可选的参数,用于指定聚合操作的一些选项,如是否允许磁盘操作等。

二、管道操作符

在聚合操作中,管道操作符是我们最常用的工具之一,它们用于对文档进行各种计算和转换操作。下面是一些常用的管道操作符及其作用:

1. $match

$match 管道用于筛选符合条件的文档,类似于 find 操作中的查询条件。例如,下面的代码可以筛选出 age 大于等于 18 的文档:

-------------------------
    - ------- - ---- - ----- -- - - -
---

2. $group

$group 管道用于按照指定的字段进行分组,并对每个分组进行计算。例如,下面的代码可以按照 gender 字段分组,并计算每个分组中的文档数量:

-------------------------
    - ------- - ---- ---------- ------ - ----- - - - -
---

3. $project

$project 管道用于对文档进行投影操作,即只返回指定的字段。例如,下面的代码可以只返回 name 和 age 两个字段:

-------------------------
    - --------- - ----- -- ---- -- ---- - - -
---

4. $sort

$sort 管道用于对文档进行排序操作。例如,下面的代码可以按照 age 字段进行升序排序:

-------------------------
    - ------ - ---- - - -
---

5. $limit

$limit 管道用于限制返回的文档数量。例如,下面的代码可以限制返回前 10 条文档:

-------------------------
    - ------- -- -
---

6. $skip

$skip 管道用于跳过指定数量的文档。例如,下面的代码可以跳过前 10 条文档:

-------------------------
    - ------ -- -
---

7. $unwind

$unwind 管道用于将数组字段拆分成单独的文档。例如,下面的代码可以将 tags 字段中的每个元素拆分成一个单独的文档:

-------------------------
    - -------- ------- -
---

8. $lookup

$lookup 管道用于在不同的集合之间进行查询和连接操作。例如,下面的代码可以在 orders 集合和 customers 集合之间进行连接查询:

---------------------
    -
        -------- -
            ----- ------------
            ----------- -------------
            ------------- ------
            --- ----------
        -
    -
---

三、聚合表达式

在聚合操作中,聚合表达式是用于计算和转换数据的重要工具。聚合表达式可以用于各种管道操作符中,例如 $group、$project 等。下面是一些常用的聚合表达式及其作用:

1. $sum

$sum 表达式用于计算指定字段的总和。例如,下面的代码可以计算 age 字段的总和:

-------------------------
    - ------- - ---- ----- --------- - ----- ------ - - -
---

2. $avg

$avg 表达式用于计算指定字段的平均值。例如,下面的代码可以计算 age 字段的平均值:

-------------------------
    - ------- - ---- ----- ------- - ----- ------ - - -
---

3. $min

$min 表达式用于找出指定字段的最小值。例如,下面的代码可以找出 age 字段的最小值:

-------------------------
    - ------- - ---- ----- ------- - ----- ------ - - -
---

4. $max

$max 表达式用于找出指定字段的最大值。例如,下面的代码可以找出 age 字段的最大值:

-------------------------
    - ------- - ---- ----- ------- - ----- ------ - - -
---

5. $size

$size 表达式用于计算指定数组字段的长度。例如,下面的代码可以计算 tags 数组字段的长度:

-------------------------
    - --------- - --------- - ------ ------- - - -
---

6. $cond

$cond 表达式用于根据条件返回不同的值。例如,下面的代码可以根据 age 字段的值返回不同的结果:

-------------------------
    -
        --------- -
            --------- -
                ------ -
                    --- - ----- -------- --- --
                    ----- ------ ----
                    ----- ----- ---
                -
            -
        -
    -
---

7. $dateToString

$dateToString 表达式用于将日期类型的字段转换为字符串类型。例如,下面的代码可以将 createdAt 字段转换为字符串类型:

-------------------------
    -
        --------- -
            ---------------- -
                -------------- -
                    ------- --------- ----------
                    ----- ------------
                -
            -
        -
    -
---

四、示例代码

下面是一些实际的示例代码,帮助读者更好地理解和应用 MongoDB 中的聚合操作:

1. 按照性别分组,计算每个分组中的文档数量和平均年龄

-------------------------
    -
        ------- -
            ---- ----------
            ------ - ----- - --
            ------- - ----- ------ -
        -
    -
---

2. 按照标签分组,计算每个分组中的文档数量和平均年龄,并按照数量进行降序排序

-------------------------
    - -------- ------- --
    -
        ------- -
            ---- --------
            ------ - ----- - --
            ------- - ----- ------ -
        -
    --
    - ------ - ------ -- - -
---

3. 按照创建时间分组,计算每天的文档数量和平均年龄,并按照时间进行升序排序

-------------------------
    -
        ------- -
            ---- -
                -------------- -
                    ------- -----------
                    ----- ------------
                -
            --
            ------ - ----- - --
            ------- - ----- ------ -
        -
    --
    - ------ - ---- - - -
---

五、总结

通过本文的介绍,我们了解了 MongoDB 中的聚合操作及其常用的管道操作符和聚合表达式。聚合操作可以帮助我们对文档进行高效、灵活的计算和分析,是 MongoDB 中非常重要的一项技术。希望本文能够对读者有所启发,帮助读者更好地应用 MongoDB 中的聚合操作。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65cdc40cadd4f0e0ff6f008d