MongoDB - 聚合查询

MongoDB的聚合框架基于管道概念,通过$match筛选、$group分组、$project投影等阶段进行数据处理。常用操作包括查询、排序、跳过和限制。投影阶段支持字段的删除和计算,而$unwind用于展开数组字段。$group配合累加器如$sum和$avg进行统计分析,最后可以使用$out或$merge将结果入库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚合管道

聚合框架是 MongoDB 中的一组分析工具,可以对一个或多个集合中的文档进行分析。

MongoDB 的聚合框架基于管道的概念:首先从集合中获取到输入,然后将输入的文档传递到一个或多个阶段,每个阶段都将之前阶段输出的内容作为输入,最终得到一个聚合结果作为输出。

上面的图是一个比较宽泛的管道流程图。这里展示一个 MongoDB 聚合语句映射到管道之后的情况:

在这里可以看得出,aggregate([{}, {}]) 是一个聚合语句,在函数的数组中,每一个对象都是一个阶段,$match应该就是一个筛选文档的阶段,$group 应该就是一个分组汇总的阶段。

管道阶段

使用聚合框架最重要的就是熟悉操作的语法,以及将这些语法构建成管道当中的阶段。

在 MongoDB 聚合框架中,每一个阶段都必须要规定一个特定的阶段运算符,这些阶段运算符表明了阶段的执行规则,可以到 官方文档 上查看更多、更详细的内容。

常见操作

最常见的操作应该是能与普通查询语句对应上的操作,如查询、投影、排序、跳过、限制等等。虽然这些在一个 find() 语句中就能实现。

最常使用的操作就是查询,也可以说是筛选、过滤,在聚合框架中使用 $match 来表明这是一个筛选文档的阶段。如下是其使用语法:

 
{ $match: { <query> } }

第二个则是投影,这个阶段可以修改输入文档的结构,通常是重命名、增加、删除属性,也可以通过表达式创建计算结果以及嵌套文档。如下是其使用语法:

 
// <field>: <1 or true>
// <field>: <0 or false>
// <field>: <expression>
{ $project: { <specification(s)> } }

排序、跳过、限制都比较容易理解,实际上可以与 find() 结果的游标支持的函数做联系。如下是其使用语法:

 
// 排序
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
// 跳过
{ $skip: <positive 64-bit integer> }
// 限制
{ $limit: <positive 64-bit integer> }

上述 5 个阶段是最常用的阶段,在使用时需要注重它们的效率,一般会使用这样的顺序去构建管道:

  1. 通过筛选语句过滤指定集合,得到符合要求的文档列表;
  2. 如果排序非常重要,这一个阶段需要在过滤文档之后;
  3. 如果需要做分页功能,应该是先执行跳过的阶段,然后再到限
### MongoDB 聚合操作符列表 MongoDB 提供了一系列强大的聚合操作符,用于执行各种数据转换和分析任务。这些操作符可以在聚合管道的不同阶段使用,以实现复杂的查询需求。以下是常见的 MongoDB 聚合操作符分类及其功能概述: --- #### **1. 条件操作符** 条件操作符允许基于布尔表达式的结果进行分支判断。 - `$cond`: 根据条件返回不同的值[^4]。 - `$ifNull`: 如果字段为空或不存在,则返回替代值[^4]。 示例: ```javascript { $project: { priceCategory: { $cond: [ { $gte: ["$price", 20] }, "High", "Low" ] } } } ``` --- #### **2. 数组操作符** 数组操作符用于处理数组类型的字段。 - `$addFields`: 添加新字段或将现有字段更新为数组[^4]。 - `$unwind`: 将数组拆分为单独的文档[^4]。 - `$filter`: 对数组中的元素应用过滤器[^4]。 - `$size`: 返回数组的长度[^4]。 示例: ```javascript { $unwind: "$tags" } ``` --- #### **3. 组合计数操作符** 这些操作符通常与 `$group` 阶段一起使用,以便对数据进行汇总统计。 - `$sum`: 计算数值总和[^4]。 - `$avg`: 计算平均值。 - `$min`, `$max`: 获取最小值或最大值。 - `$push`, `$addToSet`: 收集数组中的唯一值或全部值[^4]。 示例: ```javascript { $group: { _id: null, totalQuantity: { $sum: "$quantity" } } } ``` --- #### **4. 文档操作符** 用于修改或提取文档的内容。 - `$mergeObjects`: 合并两个或多个文档[^4]。 - `$replaceRoot`: 替换根文档。 - `$setUnion`: 找到两个集合的联合。 示例: ```javascript { $replaceRoot: { newRoot: "$details" } } ``` --- #### **5. 数学运算操作符** 支持基本的数学运算以及更高级的数据变换。 - `$abs`, `$ceil`, `$floor`, `$ln`, `$log`, `$pow`, `$sqrt`: 基本数学函数。 - `$mod`: 求模运算[^4]。 - `$subtract`, `$multiply`, `$divide`, `$add`: 加减乘除运算。 示例: ```javascript { $project: { discountedPrice: { $multiply: [ "$price", 0.9 ] } } } ``` --- #### **6. 日期操作符** 专门针对日期类型字段的操作。 - `$dateToString`: 将日期格式化为字符串。 - `$year`, `$month`, `$dayOfMonth`: 提取日期组件。 - `$isoWeekDay`, `$isoYear`: ISO 时间标准下的日期解析。 示例: ```javascript { $project: { yearSold: { $year: "$saleDate" } } } ``` --- #### **7. 字符串操作符** 用于字符串的拼接、截断和其他常见操作。 - `$concat`: 拼接字符串[^4]。 - `$substrBytes`, `$substrCP`: 截取子字符串。 - `$toLower`, `$toUpper`: 修改大小写。 示例: ```javascript { $project: { fullName: { $concat: [ "$firstName", " ", "$lastName" ] } } } ``` --- #### **8. 类型转换操作符** 帮助在不同数据类型之间切换。 - `$convert`, `$toString`, `$toInt`, `$toDouble`: 数据类型强制转换。 - `$isArray`: 判断某个字段是否为数组。 示例: ```javascript { $project: { ageString: { $toString: "$age" } } } ``` --- #### **9. 特殊用途操作符** 一些特殊场景下使用的操作符。 - `$literal`: 输出字面量而非变量。 - `$meta`: 处理元数据(如文本分数)[^4]。 示例: ```javascript { $match: { score: { $meta: "textScore" } } } ``` --- ### 总结 以上列举了 MongoDB 中常用的聚合操作符类别及具体实例。每种操作符都有其独特的应用场景,合理搭配它们能够完成高度定制化的数据分析任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿小乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值