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…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
