我正在用spring boot(2.3.4)制作一个简单的应用程序,使用mongodb和mongodb的spring数据。我通常使用@query注解为应用程序创建查询,效果非常好。但是对于我想要使用的聚合,我用criteria类构建了一个查询。我需要的标准是 where("primary").is(value).and("secondary").is("")
.
我需要所有的条目,其中primary等于'value',secondary为空。在mongodb compass中输入的查询 { $and: [ { primary: 'value' }, { secondary: ''} ] }
正如预期的那样工作,但是当我尝试对spring使用criteria时,看起来与secondary的and部分被完全删除了。我得到的任何结果都是一级值,二级值。这意味着一个空字段或其他任何内容。更换 .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);
3条答案
按热度按时间7d7tgy0s1#
你没有遗漏任何东西。
where("primary").is(value).and("secondary").is("")
正确且功能等同于{ $and: [ { primary: 'value' }, { secondary: ''} ] }
. 您应该为启用调试级别日志记录MongoTemplate
查看生成的查询。2admgd592#
这对mongodb有效-不确定compass添加了什么。两个查询不会生成相同的json查询,但它们是相等的。
生成的查询
是
也许指南针不喜欢这个变种?
无论如何,要生成类似于您在compass中输入的查询,您可以使用下面的代码
6qfn3psc3#
a已使用mongo dbcompas连接到atlas,并在集合中添加了4条记录:
两个查询:
得出同样的结果:
营火你能提供你的代码分析的例子吗?