需要引入的兩個包:
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");
}