MongoDB聚合:按时间排序且限制单类别文章数量至3篇的实现方案
解决思路与实现代码
直接用MongoDB的$setWindowFields聚合阶段就能搞定,完美避开常规分组丢失时间顺序的问题,步骤如下:
- 先把所有文章按
timestamp倒序(最新在前)排好 - 用窗口函数给每个
category下的文章按时间顺序分配序号 - 过滤掉序号大于3的文章,最后就能得到符合要求的结果
具体聚合管道代码
db.blogs.aggregate([ // 全局按时间戳倒序排序,保证整体时间顺序 { $sort: { timestamp: -1 } }, // 给每个分类内的文章按时间顺序编号,不打乱全局列表结构 { $setWindowFields: { partitionBy: "$category", sortBy: { timestamp: -1 }, output: { categoryRank: { $rank: {} } } } }, // 只保留每个分类下前3篇文章 { $match: { categoryRank: { $lte: 3 } } }, // 可选:不需要rank字段的话可以移除 { $unset: "categoryRank" } ])
方案优势
- 先全局排序确保最终结果的时间顺序不会混乱
$setWindowFields无需分组就能给同分类文章编号,完全保留原有的列表结构,不会像$group那样把同分类文章聚合到一起- 最后通过序号过滤精准控制每个分类的展示数量
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

