java—创建类似“a是”b“c是”的查询(spring boot/spring data w/mongo)

vsdwdz23  于 2021-07-07  发布在  Java
关注(0)|答案(3)|浏览(282)

我正在用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);
7d7tgy0s

7d7tgy0s1#

你没有遗漏任何东西。 where("primary").is(value).and("secondary").is("") 正确且功能等同于 { $and: [ { primary: 'value' }, { secondary: ''} ] } . 您应该为启用调试级别日志记录 MongoTemplate 查看生成的查询。

2admgd59

2admgd592#

这对mongodb有效-不确定compass添加了什么。两个查询不会生成相同的json查询,但它们是相等的。
生成的查询

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

{"primary":value, "secondary": ""}

也许指南针不喜欢这个变种?
无论如何,要生成类似于您在compass中输入的查询,您可以使用下面的代码

Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("primary").is("hello"), Criteria.where("secondary").is(""));
Query query = Query.query(criteria);
6qfn3psc

6qfn3psc3#

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=''}]

营火你能提供你的代码分析的例子吗?

相关问题