在 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