Java 如何根据条件忽略聚合阶段?

Java 如何根据条件忽略聚合阶段?,java,mongodb,aggregation-framework,Java,Mongodb,Aggregation Framework,我正在使用MongoDB的Java驱动程序从MongoDB获取数据。我试图将筛选器数据添加到我的查询中,但它不是空的。如果过滤器数据当时为null,则返回null值,因为由于过滤器为null,因此无法找到满足查询的数据。但概念是排除过滤数据,并继续处理剩余的条件,如属于\u所有者\u DSID,仅被删除 我尝试过使用匹配(ne(filter,null)),但它显示了编译错误 List<Bson> filters = new ArrayList<Bson>(); if (v

我正在使用MongoDB的Java驱动程序从MongoDB获取数据。我试图将筛选器数据添加到我的查询中,但它不是空的。如果过滤器数据当时为null,则返回null值,因为由于过滤器为null,因此无法找到满足查询的数据。但概念是排除过滤数据,并继续处理剩余的条件,如
属于\u所有者\u DSID
仅被删除

我尝试过使用
匹配(ne(filter,null))
,但它显示了编译错误

List<Bson> filters = new ArrayList<Bson>();
if (valueOfMonth != 0) {
    filters.add(gt(TECHNOLOGY_VERSION_EOL_KEY, LocalDate.now()));
    filters.add(lt(TECHNOLOGY_VERSION_EOL_KEY, getFutureDate(valueOfMonth)));
}
Map<String, Object> multiIdMap = new HashMap<String, Object>();
multiIdMap.put(APPLICATION, "$application");
multiIdMap.put(TECHNOLOGY, "$technology");

@SuppressWarnings({ "rawtypes", "unchecked" })
AggregateIterable<Document> result = technologiesCollection.aggregate(
        Arrays.asList(
            match(eq(BELONGS_TO_OWNER_DSID, dsId)), 
            match(eq(IS_DELETED, false)),
            match(and(filters)),
            project(Projections.include(TECHNOLOGY, APPLICATION)), 
            group(multiIdMap, Accumulators.sum("count", 1)),
            sort(eq("count", 1)), 
            addFields(new Field("data", "$_id")), 
            project(eq("_id", 0))), 
        Document.class);
List filters=new ArrayList();
如果(月值!=0){
filters.add(gt(TECHNOLOGY\u VERSION\u EOL\u KEY,LocalDate.now());
添加(lt(技术版本下线键,getFutureDate(每月值));
}
Map multiIdMap=newhashmap();
multiIdMap.put(应用程序,“$APPLICATION”);
multiIdMap.put(技术,“$TECHNOLOGY”);
@SuppressWarnings({“rawtypes”,“unchecked”})
AggregateItable结果=TechnologieCollection.aggregate(
Arrays.asList(
匹配(eq(属于所有者DSID,DSID)),
匹配(等式(已删除,错误)),
匹配(和(过滤器)),
项目(预测。包括(技术、应用)),
组(多IDMAP、累加器和(“计数”,1)),
排序(等式(“计数”,1)),
addFields(新字段(“数据”,“美元id”)),
项目(等式(“_id”,0)),
文件(类别);
预期结果是,如果
valueOfMonth=0
,则我不希望在where查询中使用该筛选数据,而是使用剩余的数据,如
属于\u所有者\u DSID
仅被删除
字段,并给出整个结果

过滤器数据仅在
月值
大于零时进行过滤,但如果为零,则返回所有匹配
属于\u所有者\u DSID的值
仅被删除
,不包含
月值


如果我给出
valueOfMonth>0
,代码将按预期工作。但是,对于0,它将返回null,因为它无法找到满足查询的数据。

如何执行以下操作

List<Document> aggregationList = new ArrayList()<>;
aggregationList.add(match(eq(BELONGS_TO_OWNER_DSID, dsId)));
aggregationList.add(match(eq(IS_DELETED, false)));
if (valueOfMonth != 0) {
    List<Bson> filters = new ArrayList<Bson>();
    filters.add(gt(TECHNOLOGY_VERSION_EOL_KEY, LocalDate.now()));
    filters.add(lt(TECHNOLOGY_VERSION_EOL_KEY, getFutureDate(valueOfMonth)));
    aggregationList.add(match(and(filters)));
}

aggregationList.add(project(Projections.include(TECHNOLOGY, APPLICATION)));
// add other stages...

AggregateIterable<Document> result = coll.aggregate(aggregationList, Document.class);
List aggregationList=new ArrayList();
aggregationList.add(匹配(eq(属于所有者、DSID));
add(匹配(eq(IS_DELETED,false));
如果(月值!=0){
列表过滤器=新的ArrayList();
filters.add(gt(TECHNOLOGY\u VERSION\u EOL\u KEY,LocalDate.now());
添加(lt(技术版本下线键,getFutureDate(每月值));
add(匹配(和(过滤器));
}
添加(项目(预测,包括(技术、应用));
//添加其他阶段。。。
AggregateItable结果=集合聚合(aggregationList,Document.class);

valueOfMonth==0
时,聚合列表中根本没有
匹配(和(过滤器))
。因此,无需尝试使用MongoDB驱动程序来禁用
过滤器
逻辑,在这种情况下,它将被忽略。

List filters=new ArrayList();添加(eq(属于所有者,DSID));filters.add(等式(IS_DELETED,false));如果(valueOfMonth!=0){filters.add(gt(TECHNOLOGY\u VERSION\u EOL\u KEY,LocalDate.now());filters.add(lt(TECHNOLOGY\u VERSION\u EOL\u KEY,getFutureDate(valueOfMonth));}@user10382836哦,是的,这也是一个很好的方法,对所有条件执行
和()
,并使用if检查过滤这两个条件。