首页 > 解决方案 > java - 如何组合'and'和'or'运算符以在java中获取mongo db中的数据

问题描述

我有以下输入 json 数据来从数据库中获取过滤后的结果:

  {
       "title": "course",
       "filter": {
        "subject": ["java"],
        "branch": ["CS", "IT"]
    }

从上面输入的json数据中,我需要过滤掉以下场景中的记录:

结果包含搜索字符串“course”且主题为“java”且分支为“CS”或“IT”。

使用以下代码:

import java.util.List;
import java.util.Map;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class SearchRequest{

    private String title;
    
    private Map<String, Object> filters;
}

I have tried to following code for the desired output:
 
 public List<CourseEntity> getData(SearchRequest searchParams) {
query.addCriteria(Criteria.where("title").is(searchParams.getTitle()).andOperator(Criteria.where("subject").is(searchParams.getFilters().get("subject"))
        .andOperator(Criteria.where("branch").in(searchParams.getFilters().get("branch")))));
}

但没有通过这种方式成功。我们怎样才能得到这个?

标签: javaspringmongodbmongodb-queryaggregation-framework

解决方案


如果分支是一个列表,首先您可以将它们收集到一个新的 Criteria 列表中:

ArrayList<Criteria> branchCriteriaList = new ArrayList<>();
for (String branch : searchParams.getFilter().getBranch()) {
        branchCriteriaList.add(Criteria.where("branch").is(branch));
    }

然后使用此列表,您可以构建 AND 运算符,并在其中添加分支条件列表作为 OR 运算符,如下所示:

query.addCriteria(
            new Criteria().andOperator(
                    Criteria.where("title").is(searchParams.getTitle()),
                    Criteria.where("subject").is(searchParams.getFilter().getSubject()),
                    new Criteria().orOperator(branchCriteriaList.toArray(Criteria[]::new))
            )
    );

推荐阅读