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,用于调用原生聚合APIAggregates.group()+Accumulators.push():对应MongoDB聚合语法中的$group和$push操作,"$$ROOT"代表当前完整文档AggregateOptions:配置聚合的额外参数,与原查询的maxTimeMS、allowDiskUse参数完全对应- 结果处理阶段:可根据分组后的
groupId动态创建/获取目标集合,将分组文档批量写入
内容的提问来源于stack exchange,提问作者Gero Mendy
相关产品推荐
相关产品推荐

