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

标题关于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”);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值