遇到问题--mongodb---多个criteria.orOperator报错

遇到问题--mongodb---多个criteria.orOperator或者多个criteria.andOperator报错

 

报错

 

在使用java驱动构造mongodb查询过程中发现多个criteria.orOperator或者多个criteria.andOperator报错。

 

报错信息如下:

you can't add a second '$or' expression specified $or 

 

 

 

解决方法

andOperator

 

假设我们有四个查询条件,criteria是主查询criteria。

Criteria criteria= new Criteria();

Criteria criteriaA= new Criteria();

       Criteria criteriaB= new Criteria();

        Criteria criteriaC= new Criteria();

       Criteria criteriaD= new Criteria();

 

错误方式

criteria.andOperator(criteriaA,criteriaB);

criteria.andOperator(criteriaC,criteriaD);

 

正确方式

criteria.andOperator(criteriaA,criteriaB,criteriaC,criteriaD);

 

 

 

orOperator

 

错误的方式

 

criteria.orOperator(criteriaA,criteriaB);

criteria.orOperator(criteriaC,criteriaD);

 

 

正确的方式

orOperator的情况比较复杂。

 

情况一

如果是针对同样的字段进行or。则可以使用:

 

criteria.orOperator(criteriaA,criteriaB,criteriaC,criteriaD);

 

例如:

 

 
  1. Criteria c1= Criteria.where("year").gte(startYear).lte(endYear).and("month").is(endMonth).and("day").gte(startDay).lte(endDay)

  2. .and("hour").gte(startHour).lte(endHour).and("minute").is(startMinute).and("second").gte(startSecond);

  3. Criteria c2=Criteria.where("year").gte(startYear).lte(endYear).and("month").is(endMonth).and("day").gte(startDay).lte(endDay)

  4. .and("hour").gte(startHour).lte(endHour).and("minute").is(endMinute).and("second").lte(endSecond);

  5. Criteria c3 =Criteria.where("year").gte(startYear).lte(endYear).and("month").is(endMonth).and("day").gte(startDay).lte(endDay)

  6. .and("hour").gte(startHour).lte(endHour).and("minute").gt(startMinute).lt(endMinute);

  7. Criteria cr = new Criteria();

  8.  
  9. query = new Query(cr.orOperator(c1,c2,c3));

  10.  
  11. getMongoTemplate().find(query, SensorCollection.class);


 

 

 

 

情况二

如果针对的是不同的字段,几个字段之间是or 但是 分成几组情况,每组必须满足其中一个条件。

这种情况需要使用andOperator把多个orOperator连接起来。每个orOperator是一组情况。

 

如下:

 

 
  1. Criteria criteria = new Criteria();

  2. MapSafeGetter param = new MapSafeGetter(req.getSearch());

  3. Criteria criteriaSearch = new Criteria();

  4. if (!StringUtils.isEmpty(param.getString("searchValue"))) {

  5. criteriaSearch.orOperator(Criteria.where("orderId").is(param.getString("searchValue")),

  6. Criteria.where("productName").regex(".*?" + param.getString("searchValue") + ".*"),

  7. Criteria.where("coupon").regex(".*?" + param.getString("searchValue") + ".*"),

  8. Criteria.where("receiver").regex(".*?" + param.getString("searchValue") + ".*"),

  9. Criteria.where("mobile").is(param.getString("searchValue")),

  10. Criteria.where("reason").regex(".*?" + param.getString("searchValue") + ".*"));

  11. }

  12. if (!StringUtils.isEmpty(param.getString("productId"))) {

  13. criteria.and("productId").is(param.getString("productId"));

  14. }

  15.  
  16.  
  17. criteria.and("dealed").is(false);

  18. criteria.and("invalid").ne(true);

  19. Criteria criteriaOk = new Criteria();

  20. criteriaOk.orOperator(

  21. Criteria.where("backReceived").ne(true),

  22. Criteria.where("approved").ne(true)

  23. );

  24.  
  25.  
  26. Criteria criteriaTime = new Criteria();

  27. if (!StringUtils.isEmpty(param.getString("beginTime")) || !StringUtils.isEmpty(param.getString("endTime"))) {

  28. Criteria criteriaApplyTime = new Criteria();

  29. criteriaApplyTime = criteriaApplyTime.and("applyTime");

  30. Criteria criteriaDealTime = new Criteria();

  31. criteriaDealTime = criteriaDealTime.and("dealTime");

  32.  
  33. if (!StringUtils.isEmpty(param.getString("beginTime"))) {

  34. criteriaApplyTime.gte(DateUtils.parse(param.getString("beginTime")));

  35. criteriaDealTime.gte(DateUtils.parse(param.getString("beginTime")));

  36. }

  37. if (!StringUtils.isEmpty(param.getString("endTime"))) {

  38. criteriaApplyTime.lte(DateUtils.parse(param.getString("endTime")));

  39. criteriaDealTime.lte(DateUtils.parse(param.getString("endTime")));

  40. }

  41. criteriaTime.orOperator(criteriaApplyTime, criteriaDealTime);

  42. }

  43.  
  44. criteria.andOperator(criteriaTime,criteriaSearch,criteriaOk);

  45. Query query = Query.query(criteria);

  46. query.with(new Sort(Sort.Direction.DESC, "applyTime"));

  47. long count = mongoTemplate.count(query, Cashback.class);


 

 

criteriaTime,criteriaSearch,criteriaOk分别是三组情况。

 

 

转载于:https://my.oschina.net/airship/blog/1930628

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值