MongoDB按benefit_id统计使用次数并按计数降序排序的查询实现
MongoDB 福利使用频次统计排序实现方案
实现逻辑
由于集合内单条文档对应1次福利使用记录,统计需求本质为按benefit_id维度分组统计累计使用次数,再按使用次数降序排列,完全匹配给定的示例输出要求。
方案1:$sortByCount 正确使用方式
$sortByCount本身是「按指定表达式分组、统计每组文档数、自动按计数降序排序」的语法缩写,很多人使用时得不到预期结果,基本是两类常见错误:
- 字段引用漏加
$前缀,把"$benefit_id"写成了字符串常量"benefit_id" - 管道阶段位置放错,没有把
$sortByCount作为独立的聚合管道阶段传入
正确查询代码:
db.getCollection("你的福利使用记录集合名").aggregate([ // 核心逻辑:引用benefit_id字段,自动完成分组、计数、降序排序 { $sortByCount: "$benefit_id" }, // 字段映射,匹配目标输出结构($sortByCount默认输出的分组字段名为_id,计数字段名为count) { $project: { _id: 0, benefit_id: "$_id", cnt: "$count" } } ])
方案2:通用聚合管道实现(灵活可扩展)
如果后续需要加数据筛选、关联计算等扩展逻辑,推荐用标准三段式聚合管道,逻辑直观可控,代码如下:
db.getCollection("你的福利使用记录集合名").aggregate([ // 第一步:按benefit_id分组,累计每个福利的使用次数 { $group: { _id: "$benefit_id", cnt: { $sum: 1 } } }, // 第二步:按使用次数从高到低排序 { $sort: { cnt: -1 } }, // 第三步:移除默认的_id字段,映射为目标输出结构 { $project: { _id: 0, benefit_id: "$_id" } } ])
结果校验
针对给出的4条示例测试数据,上述两个查询的输出完全符合预期:
- 排名第一的为使用2次的
benefit_id: "456" - 后续依次为各使用1次的
benefit_id: "123"和benefit_id: "789"
注意:使用次数相同的记录(如上述两个cnt=1的福利),MongoDB不会自动做二次排序,如果需要同次数场景按
benefit_id规则排序,只需在$sort阶段补充排序字段即可,例如调整为{ $sort: { cnt: -1, benefit_id: 1 } }实现降序排列计数、升序排列同计数的福利ID。
内容的提问来源于stack exchange,提问作者Amitk
相关产品推荐
相关产品推荐

