使用mongoTemplate实现多条件加分组查询方式
作者:intomylife 发布时间:2022-05-21 01:41:51
先来一个常见的错误信息:
Due to limitations of the com.mongodb.BasicDocument, you can't add a second '$and' expression specified as '$and :
错误原因:
在一个 Criteria 对象中调用了多次 andOperator() 方法
mongoTemplate实现多条件查询
多个条件的查询只需要创建 Query 对象,然后把需要添加的条件使用 Query 对象的 addCriteria() 方法
// 场景:查询指定时间段内,状态为1的数据
// 入参条件 :beginTime ,endTime ,statue
// mongodb字段:time , state
// 存放条件的对象
Query condition= new Query();
// 判断时间是否为空
if(beginTime != null && endTime != null){
// 添加大于开始时间小于结束时间的条件
condition.addCriteria(Criteria.where("time").gte(beginTime).lte(endTime));
}else{
// 其中一个为空 分别进行判断
if(beginTime != null){
condition.addCriteria(Criteria.where("time").gte(beginTime));
}
if(endTime != null){
condition.addCriteria(Criteria.where("time").lte(endTime));
}
}
// 添加状态为1条件
if(statue!=null){
condition.addCriteria(Criteria.where("state").is(statue));
}
条件有了后再调用 mongoTemplate.find(condition,返回类型.class,collectionName)
但是...想要分组,得调用 mongoTemplate.group(Criteria criteria , String inputCollectionName , GroupBy groupBy , Class<T> entityClass) 方法 (不是说只能这样才能分组,而是我通过这种方法实现了分组查询)
朋友们,第一个参数条件只能入参 Criteria 对象,而不能入参 Query 对象
结果我发现 Criteria 对象有 andOperator(Criteria ... criteria) 方法
这个方法就厉害了,可以入参数组,也就是说
我们可以把查询条件先存放到一个集合里面(因为数组需要定义长度,如果条件个数不确定,就不能直接定义数组),然后把集合放入数组中,再把数组入参 andOperator(Criteria ... criteria) 方法
// 场景:查询指定时间段内,状态为1的数据
// 入参条件 :beginTime ,endTime ,statue
// mongodb字段:time , state
// 定义一个存放条件的集合
List<Criteria> criteriaList = new ArrayList<>();
// 定义一个存放条件的数组(暂时不给长度)
Criteria[] criteriaArray = {};
// 判断时间是否为空
if(beginTime != null && endTime != null){
// 添加大于开始时间小于结束时间的条件
Criteria between = Criteria.where("time").gte(beginTime).lte(endTime);
criteriaList.add(between);
}else{
// 其中一个为空 分别进行判断
if(beginTime != null){
Criteria gte = Criteria.where("time").gte(beginTime);
criteriaList.add(gte);
}
if(endTime != null){
Criteria lte = Criteria.where("time").lte(endTime);
criteriaList.add(lte);
}
}
// 添加状态为1条件
if(statue!=null){
Criteria isState = Criteria.where("state").is(statue);
criteriaList.add(isState);
}
// 如果有条件
if(criteriaList.size()>0){
// 集合的个数就是数组的长度
criteriaArray = new Criteria[criteriaList.size()];
// 遍历添加到数组中
for(int i = 0 ; i<criteriaList.size(); i++){
criteriaArray[i] = criteriaList.get(i);
}
}
这种就可以调用 mongoTemplate.group(Criteria criteria , String inputCollectionName , GroupBy groupBy , Class<T> entityClass) 方法进行分组查询了
GroupBy groupBy = new GroupBy("分组字段")
.initialDocument("{ count: 0 }")
.reduceFunction("function (doc,pre){pre.count +=1 ;}");
// new Criteria().andOperator(criteriaArray) 这个是很关键的一步操作,把刚刚的条件数组放入进入
// groupByResults 这个对象里面内容很多,有兴趣的朋友可以断点进入看一下
GroupByResults groupByResults = mongoTemplate.
group(new Criteria().andOperator(criteriaArray), mongodb的collectionName, groupBy, 实体类.class);
// 获取分组后的数量
long resultCount = ((List)groupByResults.getRawResults().get("retval")).size();
mongoTemplate分组查询的坑
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(new Criteria().orOperator(new Criteria("to").is(ukey), new Criteria().and("fromAccount").is(ukey))),
Aggregation.sort(Sort.Direction.DESC,"_id"),
Aggregation.group("to","fromAccount")
);
Aggregation.group 要排在Aggregation.match后面,否则结果集不准确。
来源:https://blog.csdn.net/qq_41402200/article/details/84651977


猜你喜欢
- 对流进行操作时要引用 using System.IO; 命名空间 FileStream常用的属性和方法:属性:CanRead 判断当前流是否
- 一、前言Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的。实现圆角图片的方法其实不少
- 本文实例讲述了C++实现的求解多元一次方程。分享给大家供大家参考,具体如下:注:这里计算的是n*n的等距矩阵,代码如下:#include&l
- 本文实例为大家分享了Android RecyclerView使用的具体代码,供大家参考,具体内容如下package com.itheima7
- 以下是tcp socket客户端和服务端源码,代码简单大家参考使用吧Tcp Server#include <WinSock2.h>
- 🎉工作场景中遇到这样一个需求:根据主机的 IP 地址联动更新其他模型的相关信息。需求很简单,只涉及一般的数据库联动查询以及更新操作,然而在编
- 本文实例为大家分享了Android自定义加载圈的具体代码,供大家参考,具体内容如下<RelativeLayout xmlns:andr
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 本课程的目标是帮你更有效的使用Java。其中讨论了一些高级主题,包括对象的创建、并发、序列化、反射以及其他高级特性。本课程将为你的精通Jav
- 1:Maven命令下载源码和javadocs当在IDE中使用Maven时如果想要看引用的jar包中类的源码和javadoc需要通过maven
- 本文实例讲述了Java程序中实现调用Python脚本的方法。分享给大家供大家参考,具体如下:在程序开发中,有时候需要Java程序中调用相关P
- 引言垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。垃圾收集技术需要
- 首先了解java构造函数怎么写java构造方法必须满足以下语法规则:(1) 方法名必须与类名相同。(2)不要声明返回类型。(3)不能被sta
- 优秀的战士需要出色的剑才能战斗。同样,在现代IT中,每个编码人员都需要最好的Android开发人员工具来提高他们的技能和效率。在Androi
- Spring Cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 。例如:配置管理、服务发现、断路由、智能路由、微代理、
- Android中实现沉浸式状态栏的功能,供大家参考,具体内容如下1. 先上效果图,实现沉浸式状态栏有两种方式,一种是通过写Theme主题的方
- 这节主要完成一些基本的增删改查以及Service、Dao和Action的抽取。1. Service层的抽取  
- 1.什么是单例模式?所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对
- 前言很多微信公众号中需要生成推广海报的功能,粉丝获得专属海报后可以分享到朋友圈或发给朋友,为公众号代言邀请好友即可获取奖励的。海报自带渠道二
- Spring Boot包含许多附加功能,可帮助您在将应用程序投入生产时对其进行监视和管理。可以选择使用HTTP端点或JMX管理和监视您的应用