MongoDB聚合管道(Aggregation Pipeline)
聚合管道(Aggregation Pipeline)是MongoDB中用于对数据进行处理和分析的一种强大机制。它由一系列的阶段(Stage)组成,每个阶段对输入的数据进行一种特定的操作,然后将结果传递给下一个阶段,就像在一个管道中对数据进行逐步处理一样。
1. 聚合管道的基本概念
- 数据从一个阶段流向另一个阶段,每个阶段都可以对数据进行转换、筛选、分组、计算等操作。这种管道式的处理方式使得可以对数据进行复杂的分析和处理,以满足各种业务需求。
2. 常见的聚合管道阶段
$match
阶段- 作用:用于筛选数据,类似于查询操作中的条件筛选。它可以根据指定的条件过滤掉不符合要求的文档,只有满足条件的文档才会进入下一个阶段。
- 语法示例:
{"$match": {"age": 30}}
,这个阶段会筛选出age
为30的文档。
$group
阶段- 作用:用于分组数据。它可以根据指定的字段对文档进行分组,然后可以在每个分组上进行各种计算和操作。
- 语法示例:
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
,这里会根据gender
字段进行分组,并计算每组的数量。其中_id
是分组的依据,count
是计算的结果,$sum
是用于计算总和的操作符。
$project
阶段- 作用:用于修改输入文档的结构。它可以增加或删除字段,也可以用于创建计算结果以及嵌套文档等。
- 语法示例:
{"$project": {"name": 1, "newField": {"$add": ["$age", 5]}}}
,这个阶段会保留name
字段,并创建一个新的字段newField
,其值是age
字段的值加上5。
$sort
阶段- 作用:用于对数据进行排序。它可以根据指定的字段和排序方向(升序或降序)对文档进行排序。
- 语法示例:
{"$sort": {"age": 1}}
,这里会按照age
字段升序排列文档。
$limit
阶段- 作用:用于限制输出结果的数量。它可以指定最多输出多少个文档。
- 语法示例:
{"$limit": 5}
,这个阶段会只输出前5个文档。
$skip
阶段- 作用:用于跳过指定数量的文档。它可以指定从第几个文档开始输出。
- 语法示例:
{"$skip": 3}
,这个阶段会跳过前3个文档,从第4个文档开始输出。
$unwind
阶段- 作用:用于将文档中的数组类型字段拆分成多条,每条包含数组中的一个值。这样可以对数组中的每个元素进行单独的处理。
- 语法示例:
{"$unwind": "$hobbies"}
,如果文档中有一个hobbies
数组字段,这个阶段会将其拆分成多条文档,每条文档中hobbies
字段只包含数组中的一个值。
3. 聚合管道的执行顺序
- 聚合管道中的阶段是按照定义的顺序依次执行的。数据首先进入第一个阶段进行处理,然后将处理后的结果传递给第二个阶段,以此类推,直到最后一个阶段完成对数据的处理并输出最终结果。
4. 聚合管道的应用场景
- 数据分析和统计
- 例如,计算每个部门的员工数量、平均工资,或者统计不同年龄段的用户数量等。可以通过
$group
阶段进行分组,然后使用$sum
、$avg
等操作符进行计算。
- 例如,计算每个部门的员工数量、平均工资,或者统计不同年龄段的用户数量等。可以通过
- 数据转换和预处理
- 比如,对原始数据进行清洗,删除不需要的字段(通过
$project
阶段),或者对某些字段进行计算和转换(如将字符串类型的日期字段转换为日期对象)。
- 比如,对原始数据进行清洗,删除不需要的字段(通过
- 复杂查询和业务逻辑实现
- 当需要实现一些复杂的查询条件和业务逻辑时,聚合管道可以提供更灵活的解决方案。例如,先筛选出满足一定条件的文档(
$match
阶段),然后进行分组和计算($group
阶段),最后对结果进行排序和限制输出数量($sort
和$limit
阶段)。
- 当需要实现一些复杂的查询条件和业务逻辑时,聚合管道可以提供更灵活的解决方案。例如,先筛选出满足一定条件的文档(
常见的方法和示例
在MongoDB的聚合管道中进行复杂的数据分析和处理,可以结合多个聚合阶段和操作符来实现。以下是一些常见的方法和示例:
5. 多条件筛选与分组
- 多条件筛选(
$match
)- 可以使用多个条件组合来筛选数据。例如,要筛选出年龄在25到35岁之间且部门为“研发”的员工信息:
{"$match": {"$and": [{"age": {"$gte": 25, "$lte": 35}}, {"department": "研发"}]}}
- 可以使用多个条件组合来筛选数据。例如,要筛选出年龄在25到35岁之间且部门为“研发”的员工信息:
- 分组计算(
$group
)- 对筛选后的数据进行分组,并计算每组的相关统计信息。例如,按部门分组并计算每个部门的员工数量和平均工资:
{"$group": {"_id": "$department", "count": {"$sum": 1}, "averageSalary": {"$avg": "$salary"}}
- 对筛选后的数据进行分组,并计算每组的相关统计信息。例如,按部门分组并计算每个部门的员工数量和平均工资:
6. 嵌套分组与多层次分析
- 多层次分组
- 可以进行嵌套分组,以实现更复杂的分析。例如,先按地区分组,再在每个地区内按部门分组,计算每个地区每个部门的员工数量:
{"$group": {"_id": {"region": "$region", "department": "$department"}, "count": {"$sum": 1}}
- 这里
_id
字段使用了一个包含多个属性的对象作为分组依据,实现了多层次的分组。
- 可以进行嵌套分组,以实现更复杂的分析。例如,先按地区分组,再在每个地区内按部门分组,计算每个地区每个部门的员工数量:
7. 数据转换与计算
- 字段转换(
$project
)- 使用
$project
阶段对数据进行转换。例如,将员工的入职日期字符串转换为日期对象,并计算员工的工作年限(假设当前日期为new Date()
):{"$project": {"name": 1, "hireDate": {"$dateFromString": {"dateString": "$hireDateString"}}, "yearsOfService": {"$divide": [{"$subtract": [new Date(), "$hireDate"]}, 31536000000]]}}
- 这里使用了
$dateFromString
操作符将字符串转换为日期对象,然后通过计算当前日期与入职日期的差值并除以一年的毫秒数(约为31536000000)来计算工作年限。
- 使用
- 复杂计算
- 可以在管道中进行复杂的计算。例如,计算员工的绩效得分,绩效得分由工作年限、完成项目数量和绩效评价等级综合计算得出:
{"$project": {"name": 1, "performanceScore": {"$add": [{"$multiply": ["$yearsOfService", 0.3]}, {"$multiply": ["$numberOfProjectsCompleted", 0.5]}, {"$multiply": ["$performanceRating", 0.2]}]}}
- 这里通过
$add
、$multiply
等操作符进行了复杂的计算。
- 可以在管道中进行复杂的计算。例如,计算员工的绩效得分,绩效得分由工作年限、完成项目数量和绩效评价等级综合计算得出:
8. 处理数组数据
- 数组展开(
$unwind
)- 如果文档中包含数组字段,例如员工的技能列表,可以使用
$unwind
将数组展开,以便对每个技能进行单独分析。例如:{"$unwind": "$skills"}
- 展开后,可以对每个技能进行计数、分组等操作。例如,统计每个技能被多少员工掌握:
{"$group": {"_id": "$skills", "count": {"$sum": 1}}
- 如果文档中包含数组字段,例如员工的技能列表,可以使用
9. 排序、限制与分页
- 排序(
$sort
)- 根据计算结果或特定字段对数据进行排序。例如,按部门员工数量降序排列:
{"$sort": {"count": -1}}
- 根据计算结果或特定字段对数据进行排序。例如,按部门员工数量降序排列:
- 限制结果数量(
$limit
)- 限制最终输出的结果数量。例如,只显示前10个部门的信息:
{"$limit": 10}
- 限制最终输出的结果数量。例如,只显示前10个部门的信息:
- 分页处理
- 结合
$skip
和$limit
可以实现分页功能。例如,要获取第2页的数据(每页显示10条记录),可以先跳过前10条记录(第1页的数据),然后再显示10条记录:{"$skip": 10, "$limit": 10}
- 结合
通过合理组合这些聚合阶段和操作符,可以在聚合管道中实现各种复杂的数据分析和处理任务,满足不同的业务需求。
相关文章:

MongoDB聚合管道(Aggregation Pipeline)
聚合管道(Aggregation Pipeline)是MongoDB中用于对数据进行处理和分析的一种强大机制。它由一系列的阶段(Stage)组成,每个阶段对输入的数据进行一种特定的操作,然后将结果传递给下一个阶段,就像…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(无习题)
C 中的 vector 容器详细总结 1. 什么是 vector? vector 是 C 标准模板库 (STL) 中的一种动态数组容器。它的底层实现是一个可以自动扩展的数组,支持随机访问和动态调整大小,是 C 中最常用的序列容器之一。vector 在插入、删除、遍历以及随机…...

SpringBoot技术支持的桂林景点导航
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

利用vmware在移动硬盘安装Ubuntu2go
安装 买个移动硬盘,usb插电脑,磁盘管理看磁盘序列号 vmware新建虚拟机 这一步选择磁盘管理里面看到的磁盘4 先不要开机,选择设置里面UEFI 和安装正常Ubuntu一致操作即可,这里可以不选高级,默认一个引导分区&…...

Spring Boot:中小型医院网站的敏捷开发
摘 要 本基于Spring Boot的中小型医院网站设计目标是实现用户网络预约挂号的功能,同时提高医院管理效率,更好的为广大用户服务。 本文重点阐述了中小型医院网站的开发过程,以实际运用为开发背景,基于Spring Boot框架,运…...

241011-在jupyter中实现文件夹压缩后下载
241011-在jupyter中实现文件夹压缩后下载 在使用jupyter notebook过程中,我们经常会遇到成堆的文件无法批量下载的问题,这里提供压缩文件夹代码,压缩后即可右键文件选择download实现批量下载 import zipfile import os# 设置你想要压缩的文…...

.NET 一款用于转储指定进程内存的工具
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...

Splunk 修补关键漏洞,包括远程代码执行漏洞
领先的数据分析和安全监控平台 Splunk 发布了一系列安全更新,以解决 Splunk Enterprise 和 Splunk Cloud Platform 中的多个漏洞。这些漏洞的严重程度不一,有些可实现远程代码执行(RCE),有些则允许低权限用户访问敏感信…...

搭建一个vue3+vite框架
可以使用以下两种搭建方式 通过create-vue搭建vue3 项目(建议使用) create-vue create-vue 是 Vue.js 官方推荐的用于快速启动 Vite 驱动的 Vue 项目的脚手架工具。它简化了创建新 Vue 项目的过程,提供了预配置的项目结构,并集…...

【含文档】基于Springboot+Vue的公交管理系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…...

自闭症儿童能否适应学校生活:提供专业辅助,助力顺利融入
自闭症,这一复杂的神经发育障碍,往往让许多家庭在孩子的教育问题上倍感焦虑。面对即将步入学校生活的自闭症儿童,家长们不禁要问:他们能否适应学校生活?如何帮助他们顺利融入?幸运的是,随着医疗…...

MQTTnet.Server同时支持mqtt及websocket协议
Net6后写法 Net6前写法 Program.cs using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using MQTTnet.AspNetCore; using System; using System.IO;namespace MQTTnet.Server {public class Program{publ…...

【数据结构】二叉树(一)遍历
导言 前面以及有了堆的基础,现在来学习二叉树。二叉树的学习和前面的数据结构很不一样,前面我们主要学习用数据结构储存数据,以及实际手搓数据结构的增删查改;而学习二叉树主要是为我们以后学搜索二叉树以及后面的AVL树等数据结构…...

【C++ 贪心】1616. 分割两个字符串得到回文串|1868
本文涉及知识点 C贪心 LeetCode1616. 分割两个字符串得到回文串 给你两个字符串 a 和 b ,它们长度相同。请你选择一个下标,将两个字符串都在 相同的下标 分割开。由 a 可以得到两个字符串: aprefix 和 asuffix ,满足 a aprefi…...

识别秒拨风险的具体方法及策略
秒拨技术是利用家用宽带拨号上网(PPPoE)的特性,通过频繁断线重连来获取新的IP地址,从而构建代理服务或进行其他网络活动。这种技术使得IP地址的切换频率极高,加大了识别和追踪的难度。因此,首先需要对秒拨技…...

[Python]如何在Ubuntu中建置python venv虛擬環境,並安裝TensorFlow和OpenCV函式庫?
為了在樹莓派上實現物件影像辨識功能,同時不影響樹莓派原來的python運行環境,選擇建置python虛擬環境[Note1]是一個好方式,其可避免版本衝突和不同運行環境的問題。另外,一併在該虛擬環境中安裝TensorFlow[Note2]和OpenCV[Note3]等…...

Excel:Cells(Rows.Count, 1).End(xlUp).Row和Cells(Rows.Count, 1).End(xlUp)有什么区别
Cells(Rows.Count, 1).End(xlUp).Row 和 Cells(Rows.Count, 1).End(xlUp) 是 VBA 中用于定位 Excel 工作表中单元格的两种不同用法。以下是它们的区别: 1. Cells(Rows.Count, 1).End(xlUp).Row 功能: 这个表达式返回的是一个行号(Long 类型)…...

E. Count Paths
题目 题解: #include <bits/stdc.h>#define forn(i, n) for (int i 0; i < int(n); i)using namespace std;int n; vector<int> a; vector<vector<int>> g;long long ans; vector<map<int, int>> cnt;void dfs(int v, int …...

集合论(ZFC)之良创关系(Well-Founded Relation)
定义在集合S中的一个二元关系(Binary Relation)记,<,有(S,<)。如果对于集合S的任意非空子集,都存在关系(<)下的最小元素,那么该关系&…...

centos 安装达梦数据库
一、环境准备 1.1、确认操作系统的版本和数据库的版本是否一致 ## 查看系统版本:cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)1.2、关闭防火墙和Selinux # 查看selinux是不是disabled / enforce cat /etc/selinux/config## 查看防火墙状态 fir…...

《Windows PE》6.4.1 无 DLL远程注入
本节我们将演示如何实现远程注入的两种不同方案。方案一选择远程注入代码和数据,方案二选择远程注入DLL。 本节必须掌握的知识点: 无DLL远程注入 远程注入DLL 6.4.1 无DLL远程注入 实验四十五:无DLL远程注入(C语言实现…...

浙大数据结构:10-排序6 Sort with Swap(0, i)
这道题用了数环的思想,MOOC最后视频中也有相关介绍,思想还是很巧妙的 机翻 1、思想 2、 主函数 先把数据存进来,然后从头开始遍历,如果该位置数不对则anwser,然后遍历整个环,一直加anwser,如…...

基于vue框架的的爱心捐赠物资信息系统85gsu(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
系统程序文件列表 项目功能:用户,爱心项目,捐赠类型,捐赠,积分兑换,兑换,捐赠名录,捐赠去向 开题报告内容 基于Vue框架的爱心捐赠物资信息系统开题报告 一、研究背景与意义 随着社会的发展和人们生活水平的提高,爱心捐赠活动逐渐成为连接捐赠者与受赠…...

AI对抗AI:如何应对自动化攻击新时代?
在当今这个生成式AI迅猛发展的时代,自动化攻击的威胁日益加剧。 在人工智能浪潮下,如何利用AI对抗AI,从而实现全方位的网络安全防护? 一、AI浪潮下,自动化攻击加剧 AI技术的发展既带来了前所未有的挑战,也…...

【微服务】微服务注册:构建灵活的服务管理机制
目录 引言一、什么是微服务注册?1.1 服务注册中心的作用1.2 服务注册中心的工作原理1.3 示意图 二、常见的微服务注册中心2.1 各注册中心详细对比 三、微服务注册的实现方式3.1 Spring Cloud Netflix Eureka3.2 Consul3.3 Zookeeper3.4 etcd 四、微服务注册的注意事…...

AsyncTask的工作原理和缺陷
AsyncTask的工作原理及其缺陷 AsyncTask是Android平台提供的一个轻量级的异步任务类,它允许开发者在后台线程中执行耗时操作,并在操作完成后将结果回调到主线程以更新UI。AsyncTask内部封装了线程池和Handler机制,简化了多线程编程的复杂性。…...

【React】事件绑定的方式
1. 内联函数绑定 这是最简单直接的方式,即在 JSX 语法中直接传递一个内联函数。这种方式每次渲染时都会创建新的函数实例,可能会导致不必要的性能开销。 class MyComponent extends React.Component {render() {return (<button onClick{() > th…...

Android ImageView scaleType使用
目录 一、src设置图片资源 二、scaleType设置图片缩放类型 三、scaleType具体表现 matrix: fitXY: fitStart: fitCenter: fitEnd: Center: centerCrop: centerInside: 控制ImageView和图片的大小保持一致…...

【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据
目录 前言 一、安装 二、API使用 三、完整实例 四、效果图 前言 为什么使用PhpSpreadsheet? 由于PHPExcel不再维护,所以建议使用PhpSpreadsheet来导出exlcel,但是PhpSpreadsheet由于是个新的类库,所以只支持PHP7.1及以上的版…...

Python剪辑视频
import os from moviepy.editor import VideoFileClipvideo_dir r"E:\学习\视频剪辑" s_video_file "1.mp4" d_video_file "剪辑片段1.mp4" s_video_path os.path.join(video_dir, s_video_file) # 原视频文件路径 d_video_path os.path…...