标题关于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”);
}