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

请求协助完成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();

关键说明

  1. 原生聚合里的$group阶段你可能笔误漏写了_id字段(MongoDB分组必须指定_id作为分组键),正确的原生写法应该是{$group:{"_id": "$ordenId", "transaction" : {$first:"$$ROOT"}}},Morphia的group方法会自动将你指定的分组字段映射为_id。
  2. Expressions.root()(Morphia 2.x)或直接写"$$ROOT"(Morphia 1.x)对应原生聚合里的$$ROOT,用来引用当前整个文档。

内容的提问来源于stack exchange,提问作者Ana Franco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:04:27