未能添加第二个“$or”表达式

Dik*_*hra 5 java spring mongodb

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

{
  $and : [{
    $or : [ { “field1” : “value1”}, {“field1” : “value2”}]
 },{
    $or : [ { “field2” : “value3”} , { “field2” : “value4”}]
 }]
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用 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)
Run Code Online (Sandbox Code Playgroud)

kno*_*425 6

您可以通过 Java API 通过

1) 准备一份你的“或”标准清单。

2)创建新的标准对象。

3) 使用标准对象的“andOperator”方法,将 (1) 中创建的列表“馈送”到 (2) 中创建的对象中。

像这样的东西->

    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()])));
    }
Run Code Online (Sandbox Code Playgroud)


chr*_*dam 5

尝试将其拆分为$in运算符。让我们分解第一个$or表达式:

{
    "$or": [ 
        { "filed1" : "value1" }, 
        { "filed1" : "value2" }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这可以转换为$in运算符:

{ "field1": { "$in": ["value1", "value2"] } }
Run Code Online (Sandbox Code Playgroud)

相似地

{
    "$or": [ 
        { "filed2" : "value3" }, 
        { "filed2" : "value4" }
    ]
}
Run Code Online (Sandbox Code Playgroud)

可以表示为

{ "field2": { "$in": ["value3", "value4"] } }
Run Code Online (Sandbox Code Playgroud)

将两个表达式组合成一个隐式 AND 查询会产生:

db.collection.find({
    "field1": { "$in": ["value1", "value2"] },
    "field2": { "$in": ["value3", "value4"] }
})
Run Code Online (Sandbox Code Playgroud)