首页 > 解决方案 > 创建查询,如“A 是“b”,C 是“””(Spring Boot/Spring Data w/Mongo)

问题描述

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

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

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

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

按预期工作,但是当我尝试将 Criteria 与 Spring 一起使用时,看起来与辅助部件的 and 部分已完全删除。我在primary中得到任何带有 'value' 的结果,在secondary中得到任何结果。这意味着空字段或其他任何内容。更换.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);

标签: javaspringmongodbspring-bootspring-data-mongodb

解决方案


A 已使用 Mongo DBCompas 连接到 Atlas,并向集合添加了 4 条记录:

[{
  "primary": "A",
  "secondary": "A"
},{
  "primary": "A",
  "secondary": ""
},{
  "primary": "B",
  "secondary": "B"
},{
  "primary": "B",
  "secondary": ""
}]

两个查询:

    List<Data> firstResults = mongoTemplate.query(Data.class)
            .matching(Query.query(Criteria.where("primary").is("B").and("secondary").is("")))
            .all();
    System.out.println(firstResults);

    Criteria criteria = new Criteria();
    criteria.andOperator(Criteria.where("primary").is("B"), Criteria.where("secondary").is(""));
    List<Data> secondResults = mongoTemplate.query(Data.class)
            .matching(Query.query(criteria))
            .all();
    System.out.println(secondResults);

给出了相同的结果:

[Data{primary='B', secondary=''}]

Campfire,您能否提供您的代码示例进行分析?


推荐阅读