需要引入的两个包:
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
常用的查询条件关键字:
模糊查询: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;
//开始时间如果存在 则 loginTime >= 开始时间
if(!StringUtils.isEmpty(queryVO.getStartTime())) {
criteriaDay = Criteria.where("loginTime").gte(queryVO.getStartTime());
}
//结束时间如果存在
if(!StringUtils.isEmpty(queryVO.getEndTime())) {
//开始时间不存在 则 loginTime<= 结束时间
if(criteriaDay == null){
criteriaDay = Criteria.where("loginTime").lte(queryVO.getEndTime());
}else{
//开始结束时间均存在 再加上loginyTime <= 结束时间
criteriaDay.lte(queryVO.getEndTime());
}
}
if(criteriaDay != null){
//再给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 criteria1 = Criteria.where("orgId").is(orgId);
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(criteria1),
Aggregation.group("orgId","bannerId").count().as("userCount"));
AggregationResults<DBObject> aggregationResults = statisticsTemplate.aggregate(aggregation, BannerV2Read.class, DBObject.class);
List<DBObject> mappedResults = aggregationResults.getMappedResults();
for (DBObject dbObject : mappedResults) {
String bannerId = (String) dbObject.get("bannerId");
Integer userCount = (Integer) dbObject.get("userCount");
}