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

Java中通过MongoDB聚合查询获取各channelId对应的最新插入文档

问题原因

你当前的写法仅对channelId做了分组操作,没有指定分组后需要保留的其他字段,因此聚合结果仅返回去重后的channelId值,无法拿到完整的文档内容,后续的Stream去重逻辑也没有实际作用。

解决方案

调整聚合逻辑,排序后取每个分组内最新的完整文档即可,参考代码如下:

Aggregation aggregation = Aggregation.newAggregation(
    // 按创建时间倒序排列,保证每个channelId分组内最新文档排在最前
    Aggregation.sort(Sort.Direction.DESC, Constant.CREATED_AT),
    // 按channelId分组,取分组内第一条完整的文档数据
    Aggregation.group(Constant.CHANNEL_ID)
        .first("$$ROOT").as("latestMessage"),
    // 将嵌套的最新文档替换为根节点,直接映射到Messages实体结构
    Aggregation.replaceRoot("latestMessage")
);

return mongoTemplate.aggregate(aggregation, "tbl_message", Messages.class)
        .getMappedResults();
补充说明

如果存在同一channelId下多条文档createdAt值相同的场景,可以调整排序规则增加兜底逻辑,保证取到最后插入的文档:

// 先按创建时间倒序,时间相同则按_id倒序(MongoDB的_id自带插入时间戳属性)
Aggregation.sort(Sort.by(Sort.Direction.DESC, Constant.CREATED_AT, "_id"))

内容的提问来源于stack exchange,提问作者Amit Pal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:36:00