请求协助完成Morphia聚合管道编写(附MongoDB原生代码)
没问题,我帮你把这段MongoDB原生聚合管道转换成对应的Morphia实现,完全匹配你的业务逻辑:
首先先明确你原生聚合的核心逻辑:筛选指定用户且状态不为ERROR的交易,按日期降序排序,按ordenId分组并保留每组最新的交易记录,最后将分组后的交易文档恢复为根文档格式。
Morphia 2.x+ 版本实现(推荐最新版写法)
import dev.morphia.Datastore; import dev.morphia.aggregation.AggregationPipeline; import dev.morphia.query.filters.Filters; import dev.morphia.query.Sort; import dev.morphia.aggregation.expressions.Expressions; import dev.morphia.aggregation.stages.Group; import dev.morphia.aggregation.stages.ReplaceRoot; // 假设你的Datastore实例是ds,传入的用户ID为usuarioId AggregationPipeline<TransaccionP2P> pipeline = ds.aggregate(TransaccionP2P.class) // 对应原生$match阶段:组合两个筛选条件 .match(Filters.and( Filters.equal("usuario._id", usuarioId), Filters.notEqual("status", "ERROR") )) // 对应原生$sort阶段:按date字段降序排列,确保最新的交易排在前面 .sort(Sort.descending("date")) // 对应原生$group阶段:按ordenId分组,将每组第一个文档(最新交易)存入transaction字段 .group(Group.grouping("ordenId"), Group.first("transaction", Expressions.root())) // 对应原生$replaceRoot阶段:把transaction字段的内容作为新的根文档 .replaceRoot(ReplaceRoot.replaceRoot("$transaction")); // 执行聚合并获取结果列表 List<TransaccionP2P> transacciones = pipeline.toList();
如果你使用的是 Morphia 1.x 版本(旧版兼容写法)
import org.mongodb.morphia.Datastore; import org.mongodb.morphia.aggregation.Aggregation; import org.mongodb.morphia.query.Query; import org.mongodb.morphia.query.Sort; // 构建匹配查询 Query<TransaccionP2P> matchQuery = ds.createQuery(TransaccionP2P.class) .field("usuario._id").equal(usuarioId) .field("status").notEqual("ERROR"); // 构建聚合管道并执行 List<TransaccionP2P> transacciones = ds.createAggregation(TransaccionP2P.class) .match(matchQuery) .sort(Sort.descending("date")) .group("ordenId", Aggregation.first("transaction", "$$ROOT")) .replaceRoot("$transaction") .aggregate(TransaccionP2P.class) .toList();
关键说明
- 原生聚合里的
$group阶段你可能笔误漏写了_id字段(MongoDB分组必须指定_id作为分组键),正确的原生写法应该是{$group:{"_id": "$ordenId", "transaction" : {$first:"$$ROOT"}}},Morphia的group方法会自动将你指定的分组字段映射为_id。 Expressions.root()(Morphia 2.x)或直接写"$$ROOT"(Morphia 1.x)对应原生聚合里的$$ROOT,用来引用当前整个文档。
内容的提问来源于stack exchange,提问作者Ana Franco
相关产品推荐
相关产品推荐

