我有一个列表,可用于从数据库中找到一些ID。该列表包含如下内容:
List<someObject> filterCriteria =[{"name":"somename", "value":"someValue"},{"value":"randomValue"}]
这给了我两个单独的过滤器,一个使用nameValue搜索,另一个仅使用value搜索。我使用此值建立两个条件:名称值标准:
where("person.name")
.is(filterItem.getName())
.andOperator(Criteria.where("person.value").regex(filterItem.getValue(), "i"))
和值过滤为:
where("person.value")
.regex(someString, "i");
我在单独的服务中进行迭代以将这些作为Criteria的列表接收为:
List<Criteria> criteriaList = new ArrayList<>();
filterCriteria.forEach(x -> criteriaList.add(criteriaMapper.mapFilterCriteria()));
[我正在尝试在春季使用Criteria API构建一个查询,该查询等效于具有上述条件的mongo查询
db.collection.find({$or:[{$and:[{"person.value":"jOfQIv5QMairziy"}
,{"person.name":"zzDLpQSBAA"}]},{"person.value":"re3bMfZAIDZHFPj"}]});
我无法形成写查询。我遇到了QueryBuilder API,但无法全神贯注于如何使用它。任何帮助将非常有帮助
$elemMatch
来更好地满足您的要求:List<someObject> filterCriteria =[{"name":"somename", "value":"someValue"},{"value":"randomValue"}];
List<Criteria> criterias = new ArrayList<Criteria>();
for(someObject filterItem: filterCriteria) {
//You may impement condition: If name not exists, put only value
//Criteria.where("person").elemMatch(
// Criteria.where("value").is(filterItem.getName())
//);
criterias.add(
Criteria.where("person").elemMatch(
Criteria.where("name").is(filterItem.getName())
.and("value").is(filterItem.getValue())
)
);
}
Query query = Query.query(new Criteria().orOperator(
criterias.toArray(new Criteria[criterias.length])));
List<SomeClass> result = mongoTemplate.find(query, SomeClass.class);
相当于
db.collection.find({ "$or": [ { "person": { "$elemMatch": { "value": "jOfQIv5QMairziy" } } }, { "person": { "$elemMatch": { "name": "zzDLpQSBAA", "value": "re3bMfZAIDZHFPj" } } } ] })