java - 添加第二个 '$or' 表达式失败

标签 java spring mongodb

我正在尝试通过 Java API 查询带有两个“或”子句的 mongodb 集合。当通过任何 mongo 客户端运行时,以下查询工作正常:

{
  $and : [{
    $or : [ { “field1” : “value1”}, {“field1” : “value2”}]
 },{
    $or : [ { “field2” : “value3”} , { “field2” : “value4”}]
 }]
}

但是当我尝试使用 Java API 运行它时,出现以下错误:

org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Due to limitations of the com.mongodb.BasicDBObject, you can't add a second '$or' expression specified as '$or : [ { “field1” : “value1”}, {“field1” : “value2”}]'. Criteria already contains '$or : [ { “field2” : “value3”} , { “field2” : “value4”}]'.
at org.springframework.data.mongodb.core.query.Criteria.setValue(Criteria.java:640)
at org.springframework.data.mongodb.core.query.Criteria.getCriteriaObject(Criteria.java:573)
at org.springframework.data.mongodb.core.query.Criteria.createCriteriaList(Criteria.java:630)
at org.springframework.data.mongodb.core.query.Criteria.andOperator(Criteria.java:539)

最佳答案

你可以通过 Java API 来完成

1) 准备一份“或”标准列表。

2) 创建新的条件对象。

3) 将 (1) 中创建的列表“输入”(feed) 到 (2) 中创建的对象中, 使用条件对象的“andOperator”方法。

类似这样的东西->

    Query query = new Query();
    Map<String, String> params; // let's say this arrived with some values
    List<Criteria> criterias = new ArrayList<>();

    for (String k : params.keySet()) {
        String paramVal = params.get(k);
        switch (k) {
        case "someVal1":
            criterias.add(new Criteria().orOperator(Criteria.where("metadata.field1").is(paramVal),
                    Criteria.where("metadata.field2").is(paramVal)));

            break;
        case "someVal2":
            criterias.add(new Criteria().orOperator(Criteria.where("metadata.arrayField3").in(paramVal),
                    Criteria.where("metadata.arrayField4").in(paramVal),
                    Criteria.where("metadata.arrayField5").in(paramVal)));
            break;
        default:
            break;
        }
    }

    if (criterias.size() > 0){
        query.addCriteria(new Criteria().andOperator(criterias.toArray(new Criteria[criterias.size()])));
    }

关于java - 添加第二个 '$or' 表达式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38519448/

相关文章:

java - 大量(浮点)值的最佳数据结构

java - 捕获内部音频Java

java - 异常处理 errorPage[errorCode=0, location=/error]

spring - Redis连接失败

mongodb - Dataloader 没有返回相同长度的数组?

mongodb - 在Grails中是否可以加入mongo和mysql域?

java - 将 Java 抛出异常替换为自定义消息并继续

java - 安装WALA

java - Spring ORM 4.0.5 和 Hibernate 4.3.5 - 无法保存到数据库

mongodb - 如何将转储恢复到正在运行的 mongodb