【MongoDB】--MongoDB聚合Aggregation
目录
- 一、前言
- 二、聚合管道操作
- 2.1、实际案例1
- (1)、案例--根据学生no,找到对应班级名称
- (2)、案例--这个班级有哪些学生和哪些老师在任课
- 2.2、实际案例2
- (1)、案例--主表和关联表都有条件限制,且分页返回
一、前言
聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类:单一作用聚合、聚合管道、MapReduce。
- 单一作用聚合:提供对常见聚合过程的简单访问,操作都从单个集合聚合文档
- 聚合管道操作:将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理
- MapReduce操作:是将集合中的批量文档进行分解处理,然后将处理后的各个结果进行合并输出
二、聚合管道操作
管道的主要函数方法如下:
名称 描述 类比sql
$avg 计算均值 avg
$first 返回每组第一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序返回第一个文档。 limit 0,1
$last 返回每组最后一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序返回最后一个文档。 -
$max 根据分组,获取集合中所有文档对应值的最大值。 max
$min 根据分组,获取集合中所有文档对应值的最小值。 min
$push 将指定的表达式的值添加到一个数组中。 -
$addToSet 将表达式的值添加到一个集合中(无重复值,无序)。 -
$sum 计算总和 sum
$stdDevPop 返回输入值的总体标准偏差(population standard deviation) -
$stdDevSamp 返回输入值的样本标准偏差(the sample standard deviation) -
2.1、实际案例1
classDo是班级信息
StudentDo是学生信息
teacherDo是老师信息
一个学生 关联一个班级;一个班级有多个学生;一个老师挂在多个班级下;一个班级拥有多个老师;
主要表结构字段:
ClassDo班级信息@JSONField(name = "class_no")private String classNo;@JSONField(name = "class_name")private String className;@JSONField(name = "class_position")private String classPosition;List<StudentDo> studentDos; //关联学生们List<TeacherDo> teacherDos; //关联老师们StudentDo学生信息@JSONField(name = "stu_id")private String stuId;@JSONField(name = "stu_name")private String stuName;@JSONField(name = "stu_age")private String stuAge;@JSONField(name = "chinese_score")private String chineseScore;@JSONField(name = "match_score")private String matchScore;@JSONField(name = "class_id")private ObjectId classId; //学生属于哪个班级ClassDo classDo; //学生属于具体哪个班TeacherDo老师信息@JSONField(name = "te_id")private String teId;@JSONField(name = "te_name")private String teName;@JSONField(name = "te_age")private String teAge;@JSONField(name = "class_ids")private List<ObjectId> classIds; //老师教学多个班级
(1)、案例–根据学生no,找到对应班级名称
public void aggregateStudent(String stuName,String stuAge){int page =2,maxElements=10;Criteria criteria = new Criteria();criteria.and("stuName").is(stuName);criteria.and("stuAge").is(stuAge);Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),Aggregation.lookup("w_class","classId","_id","classDo"),
// Aggregation.unwind("classDo") //加上这行,那么classDo关联时,classDo节点为null,那么就去去掉这一行Aggregation.unwind("classDo",true), //classDo为null,这个数组[index]还存在,但classDo字段不存在了// 计算思路:skip((页码-1)* maxElements)Aggregation.sort(Sort.by("stu_age").descending()),Aggregation.skip((page-1)*maxElements),// 利用limit:限制输出的文档数,即需展示的数据量(可理解为每页显示的数量)Aggregation.limit(maxElements));/*** aggregate()表明 主要查询w_student表,对应的查询条件是match(criteria);* 接着要关联w_class表。 w_student表的class_id字段关联w_class表的_id字段。*/AggregationResults<JSONObject> aggregationResults = mongoTemplate.aggregate(aggregation, "w_student", JSONObject.class);List<JSONObject> infoList = aggregationResults.getMappedResults();log.info("aggregationResults:{}", JSON.toJSONString(infoList));}
(2)、案例–这个班级有哪些学生和哪些老师在任课
备注:主表有查询条件;关联两个子表;以主表返回结果
public void aggregateClass(String className){Criteria criteria = new Criteria();criteria.and("className").is(className);Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),Aggregation.lookup("w_student","_id","classId","studentDos"),Aggregation.lookup("w_teacher","_id","classIds","teacherDos"));AggregationResults<JSONObject> aggregationResults = mongoTemplate.aggregate(aggregation, "w_class", JSONObject.class);List<JSONObject> infoList = aggregationResults.getMappedResults();log.info("aggregationResults:{}", JSON.toJSONString(infoList));}
2.2、实际案例2
现有两个mongodb表,business_permission存储某个业务的权限信息;business_a表是具体某个业务;其中business_a表的主键id关联到business_permission表的business_id。
(1)、案例–主表和关联表都有条件限制,且分页返回
由于这里的查询要求分页,那么只能对要分页的主表进行返回。
public Object templateAggregation2(int page,int size){//主表的查询条件Criteria criteria = new Criteria();criteria.and("state").is(Boolean.TRUE);//关联表的查询条件Criteria permissionCri = new Criteria();permissionCri.and("templateInfo.business_type").is(7); ///**templateInfo是关联的表结构;这个结构的permission节点是一个数组,在具体按照要求进行过滤得到需要的权限是否存在*/Criteria businessCriteria = new Criteria(); businessCriteria.andOperator(Criteria.where("templateInfo.permission.id").is("04"),Criteria.where("templateInfo.permission.permission_type").is(2));Criteria businessCriteria2 = new Criteria();
businessCriteria2.andOperator(Criteria.where("templateInfo.permission.id").is("01"),Criteria.where("templateInfo.permission.permission_type").is(2));List<Criteria> busCriteriaList = new ArrayList<>();busCriteriaList.add(businessCriteria);busCriteriaList.add(businessCriteria2);busCriteriaList.add(Criteria.where("templateInfo.all_flag").is(Boolean.TRUE));busCriteriaList.add(Criteria.where("templateInfo.permission").is(null));busCriteriaList.add(Criteria.where("templateInfo.permission").is(new ArrayList<>()));Criteria[] criArray = new Criteria[busCriteriaList.size()];busCriteriaList.toArray(criArray);permissionCri.orOperator(criArray);Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria), //主mongodb自身查询条件Aggregation.lookup("business_permission","_id","business_id","templateInfo"), //business_permission的business_id对应主表的idAggregation.match(permissionCri), //关联表查询条件Aggregation.sort(new Sort(Sort.Direction.DESC, "update_time")),// 计算思路:skip((页码-1)* maxElements)Aggregation.skip((page-1)*size),Aggregation.limit(size) //这分页的// Aggregation.group("template_type") //按照分组返回特定的字段值 【可以统计数量】// .sum("id").as("sumValue") //对id进行求和 // .first("template_code").as("templateCode")// .avg("doc_view_number").as("avgValue"));AggregationResults<JSONObject> aggregationResults = mongoTemplate.aggregate(aggregation, "business_a", JSONObject.class);List<JSONObject> templateList = aggregationResults.getMappedResults();log.info("templateList All:{}", JSON.toJSONString(templateList));return templateList;}
相关文章:
【MongoDB】--MongoDB聚合Aggregation
目录 一、前言二、聚合管道操作2.1、实际案例1(1)、案例--根据学生no,找到对应班级名称(2)、案例--这个班级有哪些学生和哪些老师在任课 2.2、实际案例2(1)、案例--主表和关联表都有条件限制,且分页返回 一、前言 聚合操作组值来自多个文档,…...

Hadoop学习指南:探索大数据时代的重要组成——Hadoop概述
前言 在当今大数据时代,处理海量数据成为了一项关键任务。Hadoop作为一种开源的分布式计算框架,为大规模数据处理和存储提供了强大的解决方案。本文将介绍Hadoop的组成和其在大数据处理中的重要作用,让我们一同踏上学习Hadoop的旅程。 Hado…...

Java实现简单小画板
Java制作简单画板,包括两个类,一个主要画板类Drawpad,一个画板监听器DrawListener类。 1、Drawpad类,包括画板,画板功能设计,保存图片等 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2…...

B078-项目实战--支付模块 领养订单支付流程
目录 支付模块需求分析表设计支付单表支付宝账号信息表-商家账号微信支付账号信息表-商家账号银行账号表-商家资金账号表支付流水表 流程分析支付基础模块继承加密算法沙箱环境准备支付宝支付-流程分析根据demo封装工具类导入依赖AlipayConfigAlipayInfoAlipayUtil 内网穿透 领…...

[css]margin-top不起作用问题(外边距合并)
在初学css时,会遇到突然间margin-top不起作用的情况。如下面: 情况一: 代码: <html> <head><style type"text/css"> * {margin:0;padding:0;border:0; }#outer {width:300px;height:300px;backgroun…...

Vue2基础八、插槽
零、文章目录 Vue2基础八、插槽 1、插槽 (1)默认插槽 作用:让组件内部的一些 结构 支持 自定义需求: 将需要多次显示的对话框, 封装成一个组件问题:组件的内容部分,不希望写死,希望能使用的时候自定义。…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:连接到特征存储]
分类目录:《自然语言处理从入门到应用》总目录 特征存储是传统机器学习中的一个概念,它确保输入模型的数据是最新和相关的。在考虑将LLM应用程序投入生产时,这个概念非常重要。为了个性化LLM应用程序,我们可能希望将LLM与特定用户…...

jenkins自定义邮件发送人姓名
jenkins发送邮件的时候发送人姓名默认的,如果要自定义发件人姓名,只需要修改如下信息即可: 系统管理-system-Jenkins Location下的系统管理员邮件地址 格式为:自定义姓名<邮件地址>...

SolidWorks二次开发---简单的连接solidworks
创建一个.net Framework的应用,正常4.0以上就可以了。 打开nuget包管理 在里面搜索paine 在版中选择对应的solidworks年份开头的,进行安装。 安装完之后 : 同时选中下面两个dll,把嵌入操作类型改为false 然后在按钮的单击事件中输入: Connect.Crea…...
docker 安装 active Mq
在安装完Docker的机器上,安装activeMQ。 拉取镜像: docker pull webcenter/activemq 查看镜像: docker images Docker运行ActiveMQ镜像 docker run --name activemq -d -p 8161:8161 -p 61616:61616 --privilegedtrue --restartalways …...

【Linux】TCP协议
🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉TCP协议&…...

DevOps系列文章之 自动化测试大全(单测和集成测试)
自动化测试业界主流工具 核心目标: 主要是功能测试和覆盖率测试 业界常用主流工具 GoogleTest GoogleTest是一个跨平台的(Liunx、Mac OS X、Windows 、Cygwin 、Windows CE and Symbian ) C单元测试框架,由google公司发布,为在不同平台上为编…...

Android启动速度优化
本节主要内容:了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startAc…...
linux 日志 系统安全日志 web日志
web日志 LINUX日志系统之WEB日志(一)_dracut.log_麻子来了的博客-CSDN博客 系统安全日志 Linux系统安全日志详解_sinolover的博客-CSDN博客 wtmp和utmp文件都是二进制文件,需使用who、w、users、last和ac来操作这两个文件。 who /var/lo…...
SpringBoot 整合 MongoDB 连接 阿里云MongoDB
注:spring-boot-starter-data-mongodb 2.7.5;jdk 1.8 阿里云MongoDB是副本集实例的 在网上查找了一番,大多数都是教连接本地mongodb或者linux上的mongodb 阿里云上有java版连接教程,但它不是SpringBoot方法配置的,是手…...

Debeizum 增量快照
在Debeizum1.6版本发布之后,成功推出了Incremental Snapshot(增量快照)的功能,同时取代了原有的实验性的Parallel Snapshot(并行快照)。在本篇博客中,我将介绍全新快照方式的原理,以…...

windows下安装composer
安装Php 教程 下载composer 官网 中文网站 exe下载地址 下载好exe 双击运行 找到php.ini注释一行代码 测试 composer -v说明安装成功 修改源 执行以下命令即可修改 composer config -g repo.packagist composer https://packagist.phpcomposer.com # 查看配置…...

企业游学进华秋,助力电子产业创新与发展
近日,淘IC企业游学活动,携20多位电子行业的企业家,走进了深圳华秋电子有限公司(以下简称“华秋”),进行交流学习、供需对接。华秋董事长兼CEO陈遂佰对华秋的发展历程、业务版块、产业布局等做了详尽的介绍&…...

玩转Tomcat:从安装到部署
文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat,我们一般会想到什么?没错,就是他,童年的回忆…...

吃透《西瓜书》第四章 决策树定义与构造、ID3决策树、C4.5决策树、CART决策树
目录 一、基本概念 1.1 什么是信息熵? 1.2 决策树的定义与构造 二、决策树算法 2.1 ID3 决策树 2.2 C4.5 决策树 2.3 CART 决策树 一、基本概念 1.1 什么是信息熵? 信息熵: 熵是度量样本集合纯度最常用的一种指标,代表一个系统中蕴…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...