用于在spring-data mongodb中构建动态查询的标准API

问题描述 投票:0回答:1

我有一个列表,可用于从数据库中找到一些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,但无法全神贯注于如何使用它。任何帮助将非常有帮助

mongodb spring-boot spring-data-mongodb
1个回答
0
投票
您可以使用$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" } } } ] })

© www.soinside.com 2019 - 2024. All rights reserved.