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
相关产品推荐
相关产品推荐

