You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus Panache MongoDB代码实现聚合(Group操作)方法咨询

在Quarkus Panache MongoDB中实现按groupId分组的聚合操作

Quarkus Panache MongoDB虽封装了常用CRUD操作,但复杂聚合逻辑可直接调用底层MongoDB Java驱动API实现。以下是对应你需求的代码实现,将MongoDB Compass生成的聚合查询转换为Java代码:

实体类(格式化后)

public class MyClass extends PanacheMongoEntity {
    String groupId;
    String uuid;
    String otherField;
}

聚合分组实现代码

import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Aggregates;
import com.mongodb.client.model.Accumulators;
import org.bson.Document;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

public class MyClassService {

    public void groupAndSplitByGroupId() {
        // 获取Panache实体对应的底层MongoCollection
        MongoCollection<Document> sourceCollection = MyClass.mongoCollection();

        // 构建聚合管道,对应MongoDB的$group阶段
        var pipeline = Arrays.asList(
            Aggregates.group(
                "$groupId", // 按groupId字段分组
                Accumulators.push("collection", "$$ROOT") // 将完整文档推入collection数组
            )
        );

        // 设置聚合选项:匹配原查询的maxTimeMS和allowDiskUse参数
        var aggregateOptions = com.mongodb.client.model.AggregateOptions.builder()
            .maxTime(60000, TimeUnit.MILLISECONDS)
            .allowDiskUse(true)
            .build();

        // 执行聚合查询
        AggregateIterable<Document> groupedResult = sourceCollection.aggregate(pipeline, aggregateOptions);

        // 处理分组结果:按groupId写入不同集合
        groupedResult.forEach(groupDoc -> {
            String groupId = groupDoc.getString("_id");
            // 获取当前分组下的所有完整文档
            var groupedDocuments = groupDoc.getList("collection", Document.class);
            
            // 创建/获取目标集合(命名示例:group_{groupId})
            MongoCollection<Document> targetCollection = MyClass.mongoDatabase().getCollection("group_" + groupId);
            // 将分组文档批量写入目标集合
            targetCollection.insertMany(groupedDocuments);
        });
    }
}

关键代码说明

  • MyClass.mongoCollection():Panache提供的静态方法,直接获取实体对应的底层MongoCollection,用于调用原生聚合API
  • Aggregates.group() + Accumulators.push():对应MongoDB聚合语法中的$group和$push操作,"$$ROOT"代表当前完整文档
  • AggregateOptions:配置聚合的额外参数,与原查询的maxTimeMS、allowDiskUse参数完全对应
  • 结果处理阶段:可根据分组后的groupId动态创建/获取目标集合,将分组文档批量写入

内容的提问来源于stack exchange,提问作者Gero Mendy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:24:59