You need to enable JavaScript to run this app. MongoDB按benefit_id统计使用次数并按计数降序排序的查询实现
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.14 09:06:07