java - 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")))));
}
但没有通过这种方式成功。我们怎样才能得到这个?
解决方案
如果分支是一个列表,首先您可以将它们收集到一个新的 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))
)
);
推荐阅读
- vb.net - 计数分析数步 -1 到 0(1/2、2/3 和 3/3)
- javascript - nvd3 多条形图显示无数据
- apache-karaf - 启动 OSGi 包时无法解析模块
- jenkins - 由于 com.thoughtworks.xstream.mapper.CannotResolveClassException,Jenkins 重启后无法启动
- python - 重复索引列表
- java - 相对于其位置解析 maven 依赖项中的文件
- node.js - 业力管道测试:_this.handler.handle 不是抛出的函数
- tsql - TSQL order by 但首先显示这些
- r - r ggmap:告诉 mapdist 如何将没有中转值的行分类为 NA
- oracle-apex-18.2 - 从 Apex 18.2 上的自动完成字段中删除值时如何触发操作