文档章节

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

Airship
 Airship
发布于 2018/08/20 10:54
字数 569
阅读 14
收藏 0

遇到问题--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://blog.csdn.net/zzq900503/article/details/75570812

共有 人打赏支持
Airship
粉丝 41
博文 967
码字总数 20029
作品 0
南京
高级程序员
私信 提问
php xhprof扩展xhgui安装时提示mongodb未安装

报错信息如下: Problem 1 - Installation request for mongodb/mongodb 1.0.2 -> satisfiable by mongodb/mongodb[1.0.2]. - mongodb/mongodb 1.0.2 requires ext-mongodb ^1.1.0 -> the req......

MHZ
2017/01/05
247
0
mongodb 32位大数据量处理

今天使用mongodb存储系统日志,小批量测试没有问题 大批量储存时mongodb后台一直报错,内容乱码. 大概是200多万的时候,512M的文件创建成功,1024的无法创建了.后台就开始报错. 我使用的是 mong...

光石头
2011/12/15
1K
4
mongo duplicatekey 问题

现在生产上莫名其妙报错: java.lang.NoClassDefFoundError: com/mongodb/MongoException$DuplicateKey at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExcep......

hellotrms
2016/10/24
546
1
最全面MongoDB安装与配置

数据是每一前端人员必定接触的一样,所有的数据都是后端来编写,如果自己想练习项目,却没有数据,而是写一些假数据,去编写,或者通过json-server搭建一个数据,今天我们就通过MongoDB来搭建...

小周sri的码农
2018/08/06
0
0
ubuntu12.04安装mongodb

ubuntu12.04安装mongodb 一,在Ubuntu下最傻瓜的步骤 1.运行"apt-get install mongo" 如果遇到找不到安装包的话运行"apt-get update" 2.这时装好以后应该会自动运行mongod程序,通过"pgrep ......

durban
2012/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[walminer bug分析]checkpoint wal记录的lsn与checkpoint记录的redo点的关系

问题背景 walminer工具的用户反馈来一个问题,不管添加了多少wal日志,想要的wal文件的解析结果总是有未解析出的部分。 分析问题 分析问题发现,checkpoint wal记录之后对某个数据page进行修...

movead
14分钟前
2
0
OSChina 周二乱弹 —— 金 冈刂 犭良

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蓝瞳 :分享骇物乐团的单曲《I'll be the one》: 《I'll be the one》- 骇物乐团 手机党少年们想听歌,请使劲儿戳(这里) @尾生 :工作使人...

小小编辑
19分钟前
51
5
python中类方法和静态方法区别

面相对象程序设计中,类方法和静态方法是经常用到的两个术语。 逻辑上讲:类方法是只能由类名调用;静态方法可以由类名或对象名进行调用。 在C++中,静态方法与类方法逻辑上是等价的,只有一...

xiangyunyan
今天
10
0
Hibernate SQLite方言

以下代码有参考过github上国外某位大佬的,在发文的最新稳定版Hibernate上是可用的,有时间再仔细分析一下 import org.hibernate.dialect.Dialect;import org.hibernate.dialect.function.S...

CHONGCHEN
今天
4
0
CentOS 7 MariaDB搭建主从服务器

本文编写环境为CentOS7。确保关闭SELinux,关闭防火墙或者防打开指定端口。具体信息如下 #master[root@promote ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [r...

白豆腐徐长卿
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部