如何构建复杂的MongoDB查询?

问题描述

我有一个很大的MongoDB文档,其中包含各个字段。

在应用给定的过滤器后,我需要向客户提供所有文档。过滤器可以是firstName == name,但也可以是jobType in {PROGRAMMER,DESIGNER}

目前,我正在检查filter != null是否正确,是否正在应用query.addCriteria(...)

是否有更简洁的方法

解决方法

是的,这看起来像是战略模式的理想用例。基本上,您将创建一个接口FilterCriterion,并为要添加过滤器的每个可能的字段实现该接口。

示例:

public interface FilterCriterion{

Boolean isApplicable(DummyObject dummyObject);
Criteria getCriteria(DummyObject dummyObject);

}
public class NameFilter implements FilterCriterion{

@Override
public boolean isApplicable(DummyObject dummyObject){
    return Objects.nonNull(dummyObject.firstName);
}

@Override
public Criteria getCriteria(DummyObject dummyObject){
    return Criteria.where("firstName").is(dummyObject.firstName);
}

}

自动装配接口会给出一个实现bean列表,在该服务中,您可以使用以下条件收集条件

Criteria criteria = new Criteria();
criteria.andOperator(criteria1,criteria2...);