创建查询,如“A 是“b”,C 是 ''”(Spring Boot/Spring Data w/Mongo)

Cam*_*ire 5 java spring mongodb spring-data-mongodb spring-boot

我正在使用带有 Spring Data for MongoDB 的 MongoDB 使用 Spring Boot (2.3.4) 制作一个简单的应用程序。我通常使用 @Query 注释为应用程序创建查询,它工作得很好。但是对于我想使用的聚合,我使用 Criteria 类构建了一个查询。我需要的标准是

where("primary").is(value).and("secondary").is("").

我需要主要等于“值”且次要为空的所有条目。在 MongoDB Compass 中输入的查询

{ $and: [ { primary: 'value' }, { secondary: ''} ] }

按预期工作,但是当我尝试在 Spring 中使用 Criteria 时,看起来与次要的部分已完全删除。我在主要次要中得到任何带有“价值”的结果。这意味着空字段或其他任何内容。更换.is("")零件.regex("^$")没有帮助。

这对我来说看起来很基本,那么我在这里错过了什么?我不想用“空标志”替换空的二级,因为这感觉不对。

更新:

这是有问题的代码

Criteria crit;
if(!primary.equals(secondary)) {
    crit = where("primary").is(primary.name()).and("secondary").is(secondary.name());
} else {
    crit = where("primary").is(primary.name()).and("secondary").is("");
}
MatchOperation matchStage = Aggregation.match(crit);
GroupOperation groupStage = Aggregation.group("grouping").count().as("sum");
SortOperation sortStage = new SortOperation(Sort.by("_id"));

Aggregation aggregation = Aggregation.newAggregation(matchStage, groupStage, sortStage);
AggregationResults<TypePerGroup> results =  mongoTemplate.aggregate(aggregation, "dataCollection",  TypePerGroup.class);
Run Code Online (Sandbox Code Playgroud)

use*_*814 0

这适用于 mongodb - 不确定抽象罗盘添加了什么。两个查询不会生成相同的 json 查询,但它们是相等的。

生成的查询

where("primary").is(value).and("secondary").is(""). 
Run Code Online (Sandbox Code Playgroud)

{"primary":value, "secondary": ""}
Run Code Online (Sandbox Code Playgroud)

也许指南针不喜欢这个变体?

无论如何,要生成类似于您在指南针中输入的查询,您可以使用下面的代码

Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("primary").is("hello"), Criteria.where("secondary").is(""));
Query query = Query.query(criteria);
Run Code Online (Sandbox Code Playgroud)