【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相关推荐
- Mongodb使用之Aggregation聚合查询:.group()/.project()/.and().previousOperation()等api的使用
最近在项目中遇到了Mongodb在聚合查询上的应用,在这里做一个记录. Spring Data MongoDB 中的聚合框架支持基于以下关键抽象:Aggregation.AggregationDefi ...
- java mongo subtract_春数据MongoDB的聚合框架,例外
组 访问计算值,我有旅行的集合,每行有一个的startDateTime和completionDateTime财产.春数据MongoDB的聚合框架,例外 我试图使用聚合框架来找到用户的出行的平均持续时间 ...
- mongodb 聚合框架_如何使用MongoDB的聚合框架处理高级数据处理
mongodb 聚合框架 MongoDB has come a long way. Even though there are many NoSQL databases out there, Mong ...
- springboot集成mongoDB高级聚合查询,关联查询
目录 mongoDB的常用操作符 mongoDB的聚合管道符号 比较操作符 逻辑运算符? 注意注意注意? 数学运算符 mongoDB案例 ? ? ? ? 插入测试数据 ?mongodb的阶段操作符号 ...
- MongoDB的使用学习之(七)MongoDB的聚合查询(spring-data-mongodb两种方式)附项目源码
虽然只看了这一篇文章,但应该这个系列的文件应该都不错. http://www.cnblogs.com/ontheroad_lee/p/3756247.html 铛铛铛--项目源码下载地址:http:/ ...
- springboot集成mongoDB高级聚合查询,关联查询,lookup.let多条件关联查询。
目录 mongoDB的常用操作符 mongoDB的聚合管道符号 比较操作符 逻辑运算符 注意坑 数学运算符 mongoDB案例 插入测试数据 mongodb的阶段操作符号 $match: $count ...
- 快速掌握mongoDB(二)——聚合管道和MapReduce
上一节简单介绍了一下mongoDB的增删改查操作,这一节将介绍其聚合操作.我们在使用mysql.sqlserver时经常会用到一些聚合函数,如sum/avg/max/min/count等,mongoD ...
- mongodb的聚合操作
mongodb的聚合操作 1 mongodb的聚合是什么 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组.过滤等功 ...
- mongodb 分组聚合_mongodb 聚合命令
MongoDB中聚合主要用于处理数据,如统计平均值,求和等等,并返回计算后的数据结果. 1. count count函数返回指定集合中的数量. > db. mediaCollection.cou ...
- MongoDB,分组,聚合
使用聚合,db.集合名.aggregate- 而不是find 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数. MongoDB的聚合管道将MongoDB文档在一个管道处理 ...
最新文章
- POJ 1207 The 3n + 1 problem
- 使用sui实现的选择控件【性别、日期、省市级联】
- jQuery学习之jQuery Ajax用法详解
- main函数的参数argc和argv
- Spring Cloud 微服务架构
- 安装ISE.14.7后仿真时遇到的问题与解决
- C++算法学习(力扣:201. 数字范围按位与)
- 硬件工程师痛苦的BOM整理工作,幸好123BOM工具把我拽出水深火热之的BOM编辑工作,超级好用的研发BOM工具,集BOM编辑、BOM合并、BOM拆分、BOM整理等
- NPOI Word 换行 【XWPFDocument】
- 使用单元测试测试您的 Room 数据库
- 纯鼓点节奏_[鼓点] 简单的鼓点节奏
- c# Create Excel file and save as PDF
- 设计模式——策略模式( Strategy Pattern )
- 机票价格按照淡季、旺季,头等舱和经济舱收费,输入机票原价、月份和头等舱或者经济舱 旺季(5-10月) 头等舱9折,经济舱8.5折 淡季(11-4月) 头等舱7折,经济舱6.5折
- 阿里再发10亿助农,店宝宝:中小卖家喜迎流量红利
- mezzanine安装和使用
- 高校借力泛微,搭建一体化、流程化的​内控管理平台
- meta property=og标签含义及作用
- 古文觀止卷九_永州韋使君新堂記_柳宗元
- 淋巴瘤最新研究进展(2022年4月)