关于mongoDB使用java实现高级查询query参数的组装

Query是一个可以从IDbConnection类型的任意对象调用的扩展方法,它可以执行查询并映射结果。

需要引入的两个包:

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

参数

下表显示了Query方法的不同参数。

名称描述
sql要执行的查询。
param查询参数(默认为null)。
transaction需要使用的事务(默认为null)。
buffered是否从缓冲读取查询结果(默认为true)。
commandTimeout命令执行超时时间(默认为null)。
commandType命令类型(默认为null)。

常用的查询条件关键字:

名称描述
regex or:orOperator模糊查询:
gt大于
lt小于
gte大于或等于
lte小于或等于
Sort排序
ne不等于
 /**
 *封装查询mongodb所需要的query
 *@param  queryVO  查询需要的参数
 */

public Query get(QueryVO queryVO){

新建一个query对象

Query query = new Query();

条件 满足orgId = queryVO.getOrgId();

query.addCriteria(Criteria.where(“orgId”).is(queryVO.getOrgId()));

条件 同时logType = queryVO.getLogType()

query.addCriteria(Criteria.where(“logType”).is(queryVO.getLogType()));

对时间进行范围查询 需要新建Criteria对象

Criteria criteriaDay = null;

##1  开始时间如果存在  则 loginTime >= 开始时间
if(!StringUtils.isEmpty(queryVO.getStartTime())) {
 criteriaDay = Criteria.where("loginTime").gte(queryVO.getStartTime());
}
##2  结束时间如果存在
if(!StringUtils.isEmpty(queryVO.getEndTime())) {
##3  开始时间不存在 则 loginTime<= 结束时间
   if(criteriaDay == null){
     criteriaDay = Criteria.where("loginTime").lte(queryVO.getEndTime());
}else{
##4  开始结束时间均存在 再加上loginyTime <= 结束时间
      criteriaDay.lte(queryVO.getEndTime());
     }
}
if(criteriaDay != null){
##5  再给query对象添加该criteriaDay对象
   query.addCriteria(criteriaDay);
}

根据多个字段来进行关键字查询 ,orOperator()相当于 mysql 中 or , regex相当于MySQL中模糊查询关键字 like

if(!StringUtils.isEmpty(queryVO.getKeyWord())) {
query.addCriteria(new Criteria ().orOperator(
Criteria.where(“userCode”).regex(queryVO.getKeyWord())
,Criteria.where(“userName”).regex(queryVO.getKeyWord())
,Criteria.where(“account”).regex(queryVO.getKeyWord())));
}

根据loginTime来进行倒序排列

query.with(new Sort(Sort.Direction.DESC, “loginTime”));
return query;
}

聚合查询:

根据orgId,bannerId分组查出各自的总数 别称为 userCount

Criteria crit= Criteria.where(“orgId”).is(orgId);
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(criteria1),
Aggregation.group(“orgId”,“bannerId”).count().as(“userCount”));

AggregationResults aggregationResults = statisticsTemplate.aggregate(aggregation, BannerV2Read.class, DBObject.class);

List mappedResults = aggregationResults.getMappedResults();
for (DBObject dbObject : mappedResults) {
String bannerId = (String) dbObject.get(“bannerId”);
Integer userCount = (Integer) dbObject.get(“userCount”);
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐