在MongoDB / Spring中具有多个条件的Concat

时间:2019-03-26 16:54:05

标签: spring mongodb spring-data-mongodb

我正在尝试实现MongoDB查询以对范围内的数据进行分组和计数。我在Lee Sherwood上找到了一篇很棒的文章,解释了如何实现这一目标,并将其与我的数据库一起使用。问题是我正在使用Spring,并且需要使用Java编写它。我设法正确地编写了聚合的两个部分,但是我坚持了这一点:

$project: {
    "range": {
        $concat: [
            { $cond: [{ $and:[ {$gt:["$dose", 0 ]}, {$lt: ["$dose", 50]}]}, "0-50", ""] },
            { $cond: [{ $and:[ {$gt:["$dose", 50 ]}, {$lt: ["$dose", 100]}]}, "50-100", ""] },
            { $cond: [{ $and:[ {$gt:["$dose", 100 ]}, {$lt: ["$dose", 150]}]}, "100-150", ""] },
            { $cond: [{ $and:[ {$gt:["$dose", 150 ]}, {$lt: ["$dose", 200]}]}, "150-200", ""] },
            { $cond: [{ $and:[ {$gt:["$dose", 200 ]}, {$lt: ["$dose", 250]}]}, "200-250", ""] },
            { $cond: [{ $and:[ {$gt:["$dose", 250 ]}, {$lt: ["$dose", 300]}]}, "250-300", ""] },
            { $cond: [{ $gte:["$dose", 300] }, "300+", ""]}
        ]
    }
}

这是我的代码:

    ProjectionOperation.ProjectionOperationBuilder projectBuilder = Aggregation.project().and("dose");
    for (int startRange = 0; startRange <= 350; startRange += step) {
        int endRange = startRange + step;
        projectBuilder.concat(...)
    }
    return projectBuilder.as("range");

您如何编写包含所有条件的concat部分?

1 个答案:

答案 0 :(得分:0)

您可以使用switch语句和条件语句来完成此操作。我在下面写了一个1例的例子。根据需要添加任意多个案例,以满足您的范围要求。

List<AggregationOperation> operationList = new ArrayList<>();
List<ConditionalOperators.Switch.CaseOperator> cases = new ArrayList<>();
ConditionalOperators.Switch.CaseOperator cond1 = ConditionalOperators.Switch.CaseOperator.when(BooleanOperators.And.and(ComparisonOperators.valueOf("dose").greaterThanValue(0), ComparisonOperators.valueOf("dose").lessThanValue(50)))
                .then("0-50");
cases.add(cond1);

ProjectionOperation projectionOperation = Aggregation.project().and(ConditionalOperators.switchCases(cases)).as("range");
operationList.add(projectionOperation);

System.out.println(aggregation.toString());