在 spring-data mongodb 中构建动态查询的条件 API
Criteria API to build dynamic query in spring-data mongodb
我有一个列表,用于从数据库中查找一些 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");
我在一个单独的服务中进行迭代以接收这些作为标准列表:
List<Criteria> criteriaList = new ArrayList<>();
filterCriteria.forEach(x -> criteriaList.add(criteriaMapper.mapFilterCriteria()));
我正在尝试使用 spring 中的条件 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"
}
}
}
]
})
我有一个列表,用于从数据库中查找一些 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");
我在一个单独的服务中进行迭代以接收这些作为标准列表:
List<Criteria> criteriaList = new ArrayList<>();
filterCriteria.forEach(x -> criteriaList.add(criteriaMapper.mapFilterCriteria()));
我正在尝试使用 spring 中的条件 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"
}
}
}
]
})