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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:20:37