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

MongoDB能否在单个聚合函数中实现多维度统计分析

MongoDB多维度统计聚合优化方案

你不需要拆分执行多次独立聚合,使用MongoDB的$facet聚合阶段即可在单次请求中完成所有维度的统计,相比多次调用聚合的方案性能提升明显。

实现方案

$facet支持在同一条聚合管道内定义多个互不干扰的子聚合流程,全程仅需扫描一次集合数据,避免了多次聚合带来的重复磁盘IO、网络往返开销。
以下是适配你需求的完整聚合代码,覆盖总书籍存量、作者总数、各作者著书量、各出版年份书籍量、各类型书籍量统计:

db.books.aggregate([
  {
    $facet: {
      // 全局概览统计
      globalStats: [
        {
          $group: {
            _id: null,
            totalBooks: { $sum: 1 }, // 书籍总存量
            allAuthors: { $addToSet: "$author" } // 收集去重后的作者列表
          }
        },
        {
          $project: {
            _id: 0,
            totalBooks: 1,
            totalAuthors: { $size: "$allAuthors" } // 计算不同作者的总数量
          }
        }
      ],
      // 按作者维度分组统计
      booksByAuthor: [
        {
          $group: {
            _id: "$author",
            bookCount: { $sum: 1 }, // 统计当前作者的著书数量
            // 若需要返回该作者下的书籍明细再保留以下push逻辑,仅计数可删除节省内存
            bookDetails: {
              $push: {
                id: "$_id",
                title: "$title",
                year: "$year"
              }
            }
          }
        },
        { $sort: { bookCount: -1 } } // 可选:按著书数量倒序排列
      ],
      // 按出版年份维度分组统计
      booksByYear: [
        {
          $group: {
            _id: "$year", // 注意:你之前的代码误写为$pubdate,实际存储字段为year
            bookCount: { $sum: 1 },
            bookDetails: {
              $push: {
                id: "$_id",
                title: "$title",
                author: "$author"
              }
            }
          }
        },
        { $sort: { _id: 1 } } // 可选:按出版年份升序排列
      ],
      // 按书籍类型维度分组统计,后续新增维度直接按相同格式追加即可
      booksByType: [
        {
          $group: {
            _id: "$book type",
            bookCount: { $sum: 1 }
          }
        }
      ]
    }
  }
])

注意事项

  • 如果你不需要获取分组下的书籍明细,不要用$push存储全量书籍ID或文档,直接用$sum:1计数即可,能大幅降低内存占用,避免触发聚合操作的内存上限。
  • $facet内的子管道语法和独立聚合的语法完全一致,你之前写的筛选、排序、分页逻辑可以直接复用,不需要做语法调整。
  • 仅当统计维度极多、单条响应返回的数据量过大时,才需要考虑拆分请求,常规网站数据说明模块的统计需求,单条$facet聚合完全可以覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:42:28