一、概述

1. 聚合的表达式

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

下表展示了一些聚合的表达式:

表达式描述实例

$sum

计算总和。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])

$avg

计算平均值

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])

$min

获取集合中所有文档对应值得最小值。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])

$max

获取集合中所有文档对应值得最大值。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])

$push

在结果文档中插入值到一个数组中。

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])

$addToSet

在结果文档中插入值到一个数组中,但不创建副本。

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])

$first

根据资源文档的排序获取第一个文档数据。

db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])

$last

根据资源文档的排序获取最后一个文档数据

db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

2. 管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

$limit:用来限制MongoDB聚合管道返回的文档数。

$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

$group:将集合中的文档分组,可用于统计结果。

$sort:将输入文档排序后输出。

$geoNear:输出接近某一地理位置的有序文档。

3. 聚合查询示例:

db.articles.aggregate( [

{ $match : { score : { $gt : 70, $lte : 90 } } },

{ $group: { _id: null, count: { $sum: 1 } } }

] );

但是在代码中要如何实现类似以上功能呢?

二、代码实现(sum求和)

功能描述:

当name和course同时传参时,按id分组,统计总分数

按name分组,统计相同name的总分数

按course分组,统计总分数

public double getTotleScoreWithMongoTemplate(StudentScore studentScore) {

//封装查询条件

List operations = new ArrayList<>();

if (StringUtils.isEmpty(studentScore.getName()) && StringUtils.isEmpty(studentScore.getCourse())){

//totleScore为StudentScore类中新建的属性,用于接收统计后的总分数;当然也可以使用score(或其他属性)接收

operations.add(Aggregation.group("id").sum("score").as("totleScore"));

}

if (!StringUtils.isEmpty(studentScore.getName())) {

operations.add(Aggregation.match(Criteria.where("name").is(studentScore.getName())));

operations.add(Aggregation.group("name").sum("score").as("totleScore"));

}

if (!StringUtils.isEmpty(studentScore.getCourse())) {

operations.add(Aggregation.match(Criteria.where("course").is(studentScore.getCourse())));

operations.add(Aggregation.group("course").sum("score").as("totleScore"));

}

Aggregation aggregation = Aggregation.newAggregation(operations);

//查询、并获取结果

AggregationResults results = mongoTemplate.aggregate(aggregation, "studentScore", StudentScore.class);

double totleScore = results.getUniqueMappedResult().getTotleScore();

return totleScore;

}

对于其他的功能,可以修改以上代码自行测试,此处不再举例

mongotemplate 查list_mongoTemplate.aggregate()聚合查询 时间相关推荐

  1. MongoTemplate 使用aggregate聚合查询

    db.getCollection('trade').aggregate([ // $match 在$group 前过滤分组前数据 $match在$group之后过滤分组后的文档{ $match : { ...

  2. mongo java aggregate_Java中使用mongodb的aggregate聚合查询

    首先,我们在数据库中,mongodb的聚合查询是这样写. db.getCollection('parking_record').aggregate( {$match : {"appId&qu ...

  3. mongotemplate 查list_mongoTemplate查询

    //设置分页 Integer pageSize = po.getPageSize(); Integer startRows = (po.getPage() - 1) * pageSize; //模糊查 ...

  4. Java中mongodb指定DB通过aggregate聚合查询操作示例

    目录 前言: 应用场景: 命令描述:​ 代码示例: 聚会查询: 数量查询: 前言: 大家都知道,mongodb是一个非关系型数据库,也就是说,mongodb数据库中的每张表是独立存在的,表与表之间没有 ...

  5. 吉林高考成绩查询2021年几号公布,2021年吉林高考成绩查询时间及查分方式

    2021年吉林高考成绩什么时候公布,几月几号可以查分?吉林高考分数查询时间在6月下旬,具体时间安排及查分方式如下,仅供参考. 2021吉林高考什么时候查分 预计成绩查询时间:6月24日左右 吉林高考成 ...

  6. mysql查询同名同姓重名人数_查全国同名同姓,怎样查重名人数查询

    查全国同名同姓,怎样查重名人数查询 时间:2020-05-10 20:30:01 不少宝爸宝妈在给婴儿起名之时,会好奇在全中国有几人同名同姓,希望新生儿的名字不会跟太多人重合.或者有的小伙伴单纯好奇全 ...

  7. Java操作Mongodb数据(增删改查聚合查询)

    文章目录 一.Java操作MongoDB 二.使用步骤 1.基础配置 2.实体类 3.MongoDB表数据 3.增删改查聚合查询 总结 一.Java操作MongoDB 上一篇文章介绍了,如何在本地使用 ...

  8. MongoTemplate 聚合查询

    一.概述 1. 聚合的表达式 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 下表展示了一些聚 ...

  9. day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询

    day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询 昨日内容复习 自定义过滤器.标签.inclusion_tag 1.首先现在应用目录下创建名字为templatet ...

最新文章

  1. Django 各类配置选项全集
  2. Lamp(fastcgi)环境的搭建
  3. LeetCode 16 3Sum Closest
  4. 【PAT乙级】1046 划拳 (15 分)
  5. android double精度_Android车辆运动轨迹平滑移动(高仿滴滴打车)最佳实践
  6. 【干货】百度十年产品经验总结:产品经理九步法
  7. 【CV】MTCNN:3个CNN,胜过1个诸葛亮
  8. ZCMU 1048: 子串
  9. .NET C/S(WinForm)开发技巧点滴(转)
  10. 欧拉心算(反演 + 积性函数筛)
  11. Leetcode unique-paths
  12. linux差分包升级流程,OTA 差分升级包的制作
  13. 小米开源 Redmi K30 Pro 内核源码
  14. 带有毫秒 转换日期_【Java学习笔记(七)】之日期类的介绍
  15. 反思设计——从大师身上反思
  16. 【Linux基础】在 Linux 上安装软件的 3 种方法
  17. 中国科学院慈松:云计算如何可持续发展
  18. 密文编码与加密算法应用
  19. c语言实现小球跳动的效果
  20. HTMl载入FLV格式网页视频播放器

热门文章

  1. vuejs和webpack项目(VueComponent)初尝试——瀑布流组件
  2. 如何验证 Active Directory 使用表单身份验证和 Visual C#.NET
  3. [转帖]最新FLASH 0DAY 漏洞总结分析篇
  4. 71.数据模型有哪几种?特征?
  5. Kaggle上主要有两大方法:梯度提升机和深度学习
  6. 28条有关人工智能的名言,靠不靠谱你来看!
  7. 高校计算机实验管理人员会议,计算机科学学院召开实验室安全与管理工作会议...
  8. c语言不用switch做计算器,超级新手,用switch写了个计算器程序,求指导
  9. python format函数实例_Python字符串格式化,format格式化函数详细使用
  10. java中extends ,implements的顺序问题