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)
您可以通过 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)
{
"$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)