前言

最近项目工作中遇到mongo复杂查询的语句使用,其中使用到数据去重,分组查询。

去重

mongo中去重和sql语句一样都是使用distinct

// 对时间范围内的name字段去重
db.getCollection("table").distinct("name",{"key":"abbe56e057f20f88dd","time" : {"$gte" : ISODate("2020-05-09T06:57:22.855+0000"), "$lte" : ISODate("2020-05-09T06:57:22.855+0000")}});// 对name字段进行去重
db.getCollection("table").distinct("name");

聚合

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

MongoDB中聚合的方法使用aggregate()。

基本语法

aggregate() 方法的基本语法格式如下所示:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

管道的概念

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

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

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

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

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

示例

db.getCollection("table").aggregate([
{$match:{"name":"zhangsan"}}, // 过滤条件
{$unwind:"$books"}, // 拆分多条,每条都是一个新数据
{$group : {_id : "$classType", count : {"$sum" : "$count"}}} // 根据类型分组,并统计count字段的总和
])

Criteria Query使用示例

  • regex模糊查询
  • 排序,分页操作
// 组装查询条件
Criteria criteria = Criteria.where("nameId").is("zhangsan").and("isCheck").is(false).and("isMan").is(true);
if (StringUtils.isNotBlank(name)) {criteria.and("name").regex(Pattern.quote(name),"i");
}
if (StringUtils.isNotBlank(des) ) {criteria.and("description").regex(Pattern.quote(des),"i");
}
if(CollectionUtils.isNotEmpty(uuids)){criteria.and("UUID").in(uuids);
}else{criteria.and("actionPluginUuid").in("");
}
Query query = new Query();
query.addCriteria(criteria);
String orderBy = param.getOrderBy();
if(StringUtils.isBlank(orderBy)){orderBy = "modifiedTime";
}
String orderType = param.getOrderType();
Sort.Direction direction = Sort.Direction.DESC;
if(("1").equals(orderType)){direction = Sort.Direction.ASC;
}
// 排序
Sort sort = new Sort(direction,orderBy);
query.with(sort);
// 分页
query.skip((param.getPageNo()-1)*param.getPageSize());
query.limit(param.getPageSize());

JAVA | MongoDB 去重、聚合函数、Criteria Query使用相关推荐

  1. oracle高级函数去重,傅老师课堂:Oracle高级应用之去重聚合函数

    开篇一笑:高中的时候,自行车被偷,早上顺路搭同学的自行车.我坐在后座看到前面一大妈跑步,很猥琐的对同学说:"你看前面那个肥婆跑得屁股都甩圆了!"这货沉默了一下.当我们和大妈擦身而过 ...

  2. MongoDB 之聚合函数查询统计

    第一关:第1关:聚合管道操作符将文档定制格式输出(一) (命令行) mongo use test1 db.educoder.insert([{ _id:1, course:'Python表达式问题求解 ...

  3. java+criteriaquery_Hibernate动态条件查询(Criteria Query)

    1.创建一个Criteria实例 net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询.Session是用来制造Criteria实例的工厂. Criteria cr ...

  4. MongoDB的聚合函数 Aggregate

    Aggregate的使用,有利于我们对MongoDB中的集合进行进一步的拆分. 示例: db.collection.aggregate({$match:{x:1},{limit:10},{$group ...

  5. mongodb的聚合函数的$redact方法运用。

    译自:http://docs.mongoing.com/manual-zh/reference/operator/aggregation/redact.html http://www.myexcept ...

  6. Java mongoDB查询(Query Criteria)

    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组. Query //添加过滤 ...

  7. php数据group去重,MongoDB_Mongodb聚合函数count、distinct、group如何实现数据聚合操作, 上篇文章给大家介绍了Mong - phpStudy...

    Mongodb聚合函数count.distinct.group如何实现数据聚合操作 上篇文章给大家介绍了Mongodb中MapReduce实现数据聚合方法详解,我们提到过Mongodb中进行数据聚合操 ...

  8. java mongo subtract_春数据MongoDB的聚合框架,例外

    组 访问计算值,我有旅行的集合,每行有一个的startDateTime和completionDateTime财产.春数据MongoDB的聚合框架,例外 我试图使用聚合框架来找到用户的出行的平均持续时间 ...

  9. mongodb 去重查询 Java,mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句...

    另外附上mongodb eclipse插件地址: http://www.jumperz.net/update/ import java.net.UnknownHostException;import ...

最新文章

  1. HTML5有哪些新特性、移除了哪些元素?
  2. 职场经典小故事-II
  3. 将Iterable转换为Collection的简便方法
  4. 1003 Emergency (25 分)【难度: 中等 / 知识点: 变种的Dijkstra】
  5. 开启Cisco交换机DHCP Snooping功能
  6. python编程入门教程100例_Python3入门经典100例(60-70)
  7. 对话即平台:利用人工智能以及云平台打造你的智能机器人
  8. 阿里开发规范_字字珠玑,高级技术专家带你了解阿里的开发流程规范
  9. Markdown数学公式参考表
  10. 高速电路设计基本概念之——PCB板材各项参数解读
  11. 空号检测模块设计原理
  12. 更新1 80000字符,自制python小游戏,手写勿喷
  13. iPS细胞移植最新进展
  14. 从阿里云迁移域名至 Amazon Route 53 帮你了解域名迁移
  15. 王者荣耀登录显示换服务器是不是封号,王者荣耀这么查看封号原因?千万不要这么做!...
  16. NFT新范式,OKALEIDO创新NFT聚合交易生态
  17. Linux Deploy在安卓手机安装LINUX系统
  18. python列表插入_python列表插入append(), extend(), insert()用法详解
  19. bilibili视频爬取报错
  20. 使用Jmeter进行接口测试时需登录后才能测试接口的配置

热门文章

  1. 用launch文件在rviz中加载机器人模型
  2. 台式机电源相关参数说明
  3. 如何将PDF转换Word?微信如何转换PDF文件?
  4. java作为微信小程序的后端_微信小程序连接java后端
  5. 背包问题-三种动态规划解法-逐步减少空间复杂度
  6. 以色列技术!Amimon无线WHDI技术解析
  7. 常见web登陆授权方式及原理
  8. L1-6 吉老师的回归 (15 分)
  9. DDos攻击解析(附现状和案例)
  10. [图文教程]BIOS设置教程