Mongodb聚合
### MongoDB 聚合框架详解 #### 概述 MongoDB 的聚合框架是数据库系统中一个强大而灵活的功能,用于处理复杂的数据分析需求。通过一系列的管道操作(pipeline stages),可以实现对数据集进行筛选、分组、计算等操作。在 MongoDB 2.2 版本之后引入了聚合框架,这为开发者提供了更高效的数据处理方式。 #### 聚合管道(Pipeline)概念 聚合管道由多个阶段(stages)组成,每个阶段针对输入文档执行特定的操作,并将处理后的结果传递给下一个阶段。这种流水线式的处理方式使得复杂的查询和数据分析变得更加简单高效。 #### 常用聚合管道阶段 ##### 1. $project 阶段 - **描述**:用于重塑文档流,可以重命名字段、添加或删除字段以及创建计算值和子文档。 - **示例**: - 只选择特定字段: ```mongodb db.article.aggregate([ { $project: { title: 1, author: 1 }} ]); ``` - 排除默认包含的 `_id` 字段: ```mongodb db.article.aggregate([ { $project: { _id: 0, title: 1, author: 1 }} ]); ``` - 创建新字段并进行计算: ```mongodb db.article.aggregate([ { $project: { title: 1, doctoredPageViews: { $add: ["$pageViews", 10] } }} ]); ``` - 复制字段: ```mongodb db.article.aggregate([ { $project: { title: 1, page_views: "$pageViews", bar: "$other.foo" }} ]); ``` ##### 2. $match 阶段 - **描述**:用于过滤文档流,只允许匹配的文档进入下一流水线阶段。此阶段使用标准的 MongoDB 查询语法。 - **示例**: - 使用 `$match` 进行条件筛选: ```mongodb db.articles.aggregate([ { $match: { category: "Technology" } }, { $project: { title: 1, author: 1 } } ]); ``` ##### 3. $limit 阶段 - **描述**:限制聚合管道中返回的文档数量。 - **示例**: - 返回前10篇文档: ```mongodb db.articles.aggregate([ { $limit: 10 } ]); ``` ##### 4. $skip 阶段 - **描述**:跳过指定数量的文档后返回其余文档。 - **示例**: - 跳过前5篇文档: ```mongodb db.articles.aggregate([ { $skip: 5 } ]); ``` ##### 5. $unwind 阶段 - **描述**:处理数组字段,将其展开成多条单独的文档。 - **示例**: - 展开 `tags` 数组字段: ```mongodb db.articles.aggregate([ { $unwind: "$tags" } ]); ``` ##### 6. $group 阶段 - **描述**:根据一组文档进行分组,并基于这些文档计算聚合值。 - **示例**: - 按类别分组并统计每类文章的数量: ```mongodb db.articles.aggregate([ { $group: { _id: "$category", count: { $sum: 1 } }} ]); ``` ##### 7. $sort 阶段 - **描述**:按指定字段对所有输入文档进行排序。 - **示例**: - 按发布时间降序排列: ```mongodb db.articles.aggregate([ { $sort: { publish_date: -1 } } ]); ``` ##### 8. $geoNear 阶段 - **描述**:基于地理空间位置进行排序。 - **示例**: - 找出离给定点最近的文章: ```mongodb db.articles.aggregate([ { $geoNear: { near: [37.8267, -122.4233], distanceField: "distance", spherical: true }} ]); ``` #### 小结 聚合框架是 MongoDB 中一项重要的功能,它提供了一种灵活的方式来处理复杂的数据分析任务。通过组合不同的管道阶段,可以构建出满足各种需求的查询逻辑。掌握这些基本的管道阶段及其使用方法对于高效地管理 MongoDB 数据库至关重要。