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

如何在MongoDB聚合查询中获取分组后的最大计数(不使用sort和limit)

解决方案

首先纠正你原聚合查询的字段问题:你的原始数据字段是name,分组时应该用_id: "$name",而非"$post.name",否则会因字段不存在导致计数错误。

要在不使用$sort和$limit的前提下获取所有计数最大的记录,可通过以下聚合管道实现:

db.Posts.aggregate([
  // 分组统计每个名称的出现次数
  {
    $group: {
      _id: "$name",
      count: { $sum: 1 }
    }
  },
  // 收集所有分组结果到数组,同时计算全局最大计数值
  {
    $group: {
      _id: null,
      allPosts: { $push: "$$ROOT" },
      maxCount: { $max: "$count" }
    }
  },
  // 展开收集的数组文档
  { $unwind: "$allPosts" },
  // 筛选出计数值等于全局最大值的记录
  {
    $match: {
      $expr: { $eq: ["$allPosts.count", "$maxCount"] }
    }
  },
  // 调整输出格式,保留目标字段
  {
    $project: {
      _id: "$allPosts._id",
      count: "$allPosts.count",
      _id: 0 // 若需保留原_id作为名称标识,可删除此行
    }
  }
])

各阶段作用说明:

  • 第一阶段$group:正确统计每个帖子名称的出现次数,得到分组计数结果。
  • 第二阶段$group:将所有分组结果存入allPosts数组,同时用$max计算出所有计数中的最大值maxCount。
  • $unwind:将数组拆分为单个文档,便于后续匹配筛选。
  • $match:通过$expr比较当前文档的计数与全局最大值,仅保留符合条件的记录。
  • $project:调整输出字段结构,使其符合预期格式。

如果存在多个计数相同的最大值(比如POST 1和POST 3的计数均为2),该管道会返回所有符合条件的记录,而非仅单条结果。

内容的提问来源于stack exchange,提问作者Cooler-cpu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:50:25