You need to enable JavaScript to run this app. MongoDB单个查询实现两个$count统计 是否需要使用$facet
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB单个查询实现两个$count统计 是否需要使用$facet

问题解答

核心结论

不需要使用$facet实现该需求,使用普通的分组聚合即可完成,性能更优。$facet适用于对同一数据集执行多组独立聚合逻辑的场景,你的需求仅为单维度分类统计,使用$facet属于过度设计,会带来额外的计算开销。

实现方案

你可以通过单次MongoDB聚合查询完成统计,步骤如下:

  1. 先通过$match过滤出用户为Emma的记录,缩小计算范围
  2. 按type字段分组统计每个类型的记录数
  3. 可选:转换为你需要的键值对输出格式

完整查询代码

db.你的集合名.aggregate([
  // 过滤用户数据
  {
    $match: {
      user: "Emma"
    }
  },
  // 按类型分组统计
  {
    $group: {
      _id: "$type",
      count: { $sum: 1 }
    }
  },
  // 转换为目标输出格式
  {
    $group: {
      _id: null,
      apple: {
        $sum: {
          $cond: [ { $eq: [ { $toLower: "$_id" }, "apple" ] }, "$count", 0 ]
        }
      },
      Orange: {
        $sum: {
          $cond: [ { $eq: [ "$_id", "Orange" ] }, "$count", 0 ]
        }
      }
    }
  },
  // 移除冗余的_id字段
  {
    $project: { _id: 0 }
  }
])

输出结果

和你预期的格式完全一致:

{
    "apple": 1,
    "Orange": 1
}

简化方案

如果不需要严格的对象格式输出,可以省略第三步格式转换,直接得到统计数组,查询性能会更高:

db.你的集合名.aggregate([
  { $match: { user: "Emma" } },
  { $group: { _id: "$type", count: { $sum: 1 } } }
])

输出示例:

[
  { "_id": "Apple", "count": 1 },
  { "_id": "Orange", "count": 2 }
]

内容的提问来源于stack exchange,提问作者Emma92

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 16:36:05