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

