如何将MongoDB的AggregateIterable<Document>映射为Java POJO并转为ArrayList
将MongoDB聚合结果映射到自定义POJO并转换为ArrayList
1. 确保POJO映射支持
如果使用原生MongoDB驱动,需先注册POJO编解码器,让驱动能自动将Document转换为你的ODSMongo类:
// 注册POJO编解码器 CodecRegistry codecRegistry = CodecRegistries.fromRegistries( MongoClientSettings.getDefaultCodecRegistry(), CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()) ); // 创建带POJO支持的MongoClient MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .codecRegistry(codecRegistry) .build()); // 获取指定泛型的集合(可选,更规范) MongoCollection<ODSMongo> collection = mongoClient.getDatabase("你的数据库名").getCollection("myCollection", ODSMongo.class);
如果使用Spring Data MongoDB,框架会自动配置POJO映射,无需额外注册编解码器。
2. 处理聚合结果并转换为ArrayList
你的聚合结果中,每个返回的Document包含docs数组,数组内的元素正好匹配ODSMongo的结构。只需遍历数组,将每个Document转为ODSMongo对象,再收集到ArrayList中即可。
方式一:传统迭代写法
List<ODSMongo> odsmongoList = new ArrayList<>(); Iterator<Document> iterator = output.iterator(); while (iterator.hasNext()) { Document resultDoc = iterator.next(); // 取出docs数组 List<Document> docs = resultDoc.getList("docs", Document.class); // 遍历数组,转换为POJO并添加到集合 for (Document doc : docs) { ODSMongo odsmongo = doc.to(ODSMongo.class); odsmongoList.add(odsmongo); } }
方式二:Java 8 Stream简化写法
import java.util.stream.Collectors; import java.util.stream.StreamSupport; // 将AggregateIterable转为Stream,扁平化处理docs数组,再映射为POJO List<ODSMongo> odsmongoList = StreamSupport.stream(output.spliterator(), false) .map(resultDoc -> resultDoc.getList("docs", Document.class)) .flatMap(List::stream) .map(doc -> doc.to(ODSMongo.class)) .collect(Collectors.toCollection(ArrayList::new));
3. 获取POJO字段值
转换完成后,直接通过ODSMongo的getter方法访问对应字段值:
for (ODSMongo item : odsmongoList) { System.out.println("ID: " + item.get_id()); System.out.println("Key: " + item.getKey()); System.out.println("最高索引: " + item.getHighestIndex()); // 其他字段同理调用getter方法 }
注意事项
- 你的聚合管道中没有返回
projectKey字段,因此转换后的ODSMongo对象中projectKey属性会为null,若需要该字段,需修改聚合的$push阶段,添加"projectKey": "$projectKey"。 - 确保
ODSMongo类的字段名与MongoDB文档中的字段名完全匹配(如POJO中的Key对应文档的Key),若字段名不一致,需使用@Field注解指定映射关系。
内容的提问来源于stack exchange,提问作者Chinmay Chikode
相关产品推荐
相关产品推荐

