mongoTemplate 聚合分组统计复杂条件分组sum\去重\$project\$cond\$addToSet

本文详细探讨了如何使用mongoTemplate进行聚合查询,重点在于分组统计、复杂条件分组以及如何实现数据去重。通过$project、$cond和$addToSet等操作符,实现了对数据的深度处理和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mongo 通道查询:

db.order.aggregate({
   
   
    $match: {
   
   
        "course_mode": {
   
   
            $gt: 2
        },
        "is_new": 1
    }
}, {
   
   

$group: {
   
   
    "_id": {
   
   
        "part_mode": "$part_mode"
        },
        "student_total": {
   
   
            $sum: 1
        },
        "student_id": {
   
   
            $addToSet: "$student_id"
        },
        "part_mode": {
   
   
            $max: "$part_mode"
        }
    }
}, {
   
   
    $project: {
   
   
        "part_mode": 1,
        "title": "新生人数累计",
        "student_total": 1,
        "students": {
   
   
            $cond: {
   
   
                if : {
   
   
                    $isArray: "$student_id"
                },
                then: {
   
   
                    $size: "$student_id"
                },
                else : 0
            }
        }
    }
}, {
   
   
    $project: {
   
   
        "part_mode": 1,
        "title": 1,
        "student_total": 1,
        "students":1,
				"rat"
### 使用 MongoDBTemplate 实现 $cond 操作符 在 `MongoDBTemplate` 中实现 `$cond` 操作符可以通过构建聚合管道来完成。具体来说,可以利用 `AggregationExpression` 和 `ConditionalOperators.Cond` 来表达条件逻辑。 对于想要应用 `$cond` 的场景,比如基于某个字段的值决定另一个字段的内容,下面是一个具体的例子: 假设有一个集合名为 `orders` ,其中包含订单数据以及运输方式 (`shippingMethod`) 字段。现在希望计算每种运输方式下的平均折扣率(`discountRate`),如果该订单有超过一定金额(例如100元),则标记为大额订单(`largeOrderFlag`);否则不作此标记。 ```java import org.springframework.data.mongodb.core.aggregation.*; import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; // 构建聚合操作 TypedAggregation<Order> aggregation = newAggregation(Order.class, group("shippingMethod") .avg("discountRate").as("averageDiscount"), project() .and(ConditionalOperators.when( ComparisonOperators.valueOf("amountPaid").greaterThanValue(100)) .then("true") .otherwise("false")) .as("largeOrderFlag")); List<DBObject> results = mongoTemplate.aggregate(aggregation, DBObject.class).getMappedResults(); for (DBObject result : results) { System.out.println(result); } ``` 上述代码展示了如何通过 `ConditionalOperators.when()` 创建一个条件判断语句[^1]。这里使用了比较运算符 `ComparisonOperators.valueOf().greaterThanValue()` 来设置当订单支付金额大于100时返回 `"true"` 否则返回 `"false"` 。最终将这个布尔标志作为新字段 `largeOrderFlag` 添加到输出文档中。 需要注意的是,在实际项目里可能还需要处理更多细节问题,如异常情况、性能优化等。此外,Spring Data MongoDB 版本不同可能会有一些API上的差异,请参照官方文档确认最新用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值