在 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"
        }
      }
    }
  ]
})