遇到问题--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
    评论
### 回答1: 当使用spring-boot-starter-data-mongodb时,如果启动时出现错误,可能有以下几个原因导致: 1. 依赖版本不匹配:请确认spring-boot-starter-data-mongodb的版本和其他相关依赖的版本是否兼容。可以通过查看官方文档或者其他资源来确认依赖的正确版本。 2. 配置错误:请检查application.properties或application.yml文件中与mongodb相关的配置项是否正确。包括数据库的连接地址、用户名、密码等。如果有特殊字符,可能需要进行转义。 3. 依赖缺失:如果启动时报错指明找不到相关的类或方法,可能是由于缺少依赖。请确认是否正确添加了spring-boot-starter-data-mongodb的依赖,并且没有遗漏其他必需的依赖。 4. 数据库连接问题:请确认mongodb数据库是否已经正确启动,并且可以通过提供的连接地址连接到数据库。可以尝试使用mongodb的官方客户端工具来测试连接的可用性。 5. 其他问题:如果以上情况都排除了,可以查看具体的错误日志或异常信息,尝试通过搜索引擎或开发社区寻找类似的问题和解决方案。 总之,在解决spring-boot-starter-data-mongodb启动报错时,需要仔细排查可能的原因,并逐一尝试解决,最终找到问题所在并进行修复。 ### 回答2: 当使用spring-boot-starter-data-mongodb启动项目时遇到错误,可能是由于以下几个原因导致的: 1. 缺少MongoDB依赖:确认在pom.xml文件中添加了正确的MongoDB依赖,例如: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 2. MongoDB的配置错误:检查application.properties或application.yml文件中的MongoDB配置,确保配置的是正确的MongoDB地址、端口和数据库名。 3. 缺少MongoDB的驱动程序:在pom.xml文件中添加MongoDB驱动程序的依赖,例如: ``` <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> </dependency> ``` 4. MongoDB连接身份验证错误:如果MongoDB设置了身份验证,需要在配置文件中添加相应的用户名和密码,确保登录凭据正确。 5. MongoDB服务未启动:检查MongoDB服务是否已经启动,可以通过命令行或者MongoDB可视化工具来确认。 如果以上步骤都正确无误,仍然无法启动项目并且出现报错,请检查报错信息,并且根据报错信息进一步排查和解决问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值