mongoTemplate 聚合

本文介绍如何在MongoDB中使用groupby进行数据分组并计算各组的记录总数,展示Crieria条件筛选技巧,包括andOperator与orOperator的结合使用,以及Query对象的排序和分页操作。

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

1. group by并且计算总数

@Test
    public void insertTest() {
        //测试数据
        //insertTestData();
        Aggregation agg = Aggregation.newAggregation(
                //Aggregation.match(Criteria.where("groupId").is(5)),
                Aggregation.group("groupId").count().as("total"), 
                Aggregation.project("total").and("groupId").previousOperation(),            
                Aggregation.sort(Sort.DEFAULT_DIRECTION, "total"));
        List<StaCount> list = mongoTemplate.aggregate(agg, "currentUser", StaCount.class).getMappedResults();
        for(StaCount count : list) {
            System.out.println(count.getGroupId() + ":" + count.getTotal());
        }
  }
如果要带其他字段,将红字变为 Aggregation.group("groupId","groupName"...),并将project的and部分去掉即可;

2. Crieria的使用,注意andOperator和orOperator的用法

Aggregation agg = Aggregation.newAggregation( 
    Aggregation.match(new Criteria()
            .andOperator(Criteria.where("onlineTime").gt(new Date()))
            .orOperator( Criteria.where("offlineTime").gt(new Date())
    ,Criteria.where("offlineTime").exists(false) ))

 

3. Query的排序和分页

Query query = new Query(Criteria.where(ReportField.GROUP_ID).in(groupIdList));
        query.with(new Sort(Direction.DESC, ReportField.ID));
        query.skip(lastId).limit(limit);

 

### 使用 `MongoTemplate` 进行聚合操作 #### 聚合框架简介 Aggregation 是一种强大的工具,用于处理和转换 MongoDB 中的数据集合。通过一系列阶段(stages),可以实现复杂的数据分析任务[^4]。 #### 创建聚合管道 为了构建一个有效的聚合查询,在 Java 应用程序中通常会利用 `org.springframework.data.mongodb.core.aggregation.Aggregation` 类及其静态方法来创建管道。下面是一个简单的例子展示如何使用 `MongoTemplate` 来执行带有匹配条件、分组以及排序功能的聚合: ```java import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; @Service public class MyService { private final MongoTemplate mongoTemplate; @Autowired public MyService(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } /** * 执行聚合操作并获取结果列表. */ List<MyDocument> performAggregation() { TypedAggregation<MyDocument> aggregation = newAggregation( match(Criteria.where("status").is("active")), // 匹配状态为 "active" 的文档 group("category") // 按类别字段进行分组 .count().as("total"), // 计算每种类别的数量 sort(Sort.Direction.DESC, "total") // 对总数降序排列 ); AggregationResults<MyDocument> results = mongoTemplate.aggregate(aggregation, MyDocument.class); return results.getMappedResults(); } } ``` 此代码片段展示了如何定义一个包含三个主要部分的聚合:首先是过滤掉不符合特定标准(`match`)的记录;其次是按照某个键值对剩余项进行汇总(`group`);最后是对最终的结果集按指定顺序重新整理(`sort`)。 对于更复杂的场景,还可以加入其他类型的 stage 如 `$project`, `$lookup`(类似于 SQL JOIN), 或者应用内置表达式来进行数值运算等高级特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值