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

MongoDB如何统计总文档数、特定类型文档数及按小时分组类别?

MongoDB聚合查询解决方案(新手向)

一、获取总文档数与特定类型文档计数

方法1:分两次查询(简单直接)

  • 总文档数:
    db.yourCollection.countDocuments({})
    
  • 特定类型(目标类别)文档数:
    db.yourCollection.countDocuments({ categories: { $in: categories } })
    

方法2:聚合一次获取(更高效)

用$facet同时返回两个结果,减少数据库请求次数:

db.yourCollection.aggregate([
  {
    $facet: {
      totalDocuments: [{ $count: "total" }],
      specificTypeDocuments: [
        { $match: { categories: { $in: categories } } },
        { $count: "count" }
      ]
    }
  }
])

二、按小时分组:特定类别出现次数+所选类别总文档数

你的现有管道问题在于覆盖了原文档的categories字段,导致无法统计单个类别出现次数。修改后的管道如下:

db.yourCollection.aggregate([
  // 筛选属于目标类别的文档
  {
    $match: {
      categories: { $in: categories }
    }
  },
  // 提取发布时间的小时部分
  {
    $addFields: {
      uniqueHour: {
        $dateToString: { format: "%H", date: "$publishedAt" }
      }
    }
  },
  // 拆分categories数组(一个文档可能属于多个类别,拆后才能单独统计)
  { $unwind: "$categories" },
  // 过滤拆分后不属于目标列表的类别
  {
    $match: {
      categories: { $in: categories }
    }
  },
  // 按小时+类别分组,统计单类别每小时出现次数
  {
    $group: {
      _id: {
        hour: "$uniqueHour",
        category: "$categories"
      },
      categoryCount: { $sum: 1 }
    }
  },
  // 按小时重新分组,汇总该小时的所有类别统计和总文档数
  {
    $group: {
      _id: "$_id.hour",
      categoryStats: {
        $push: {
          category: "$_id.category",
          count: "$categoryCount"
        }
      },
      totalHourlyCount: { $sum: "$categoryCount" }
    }
  },
  // 按小时倒序排序
  { $sort: { _id: -1 } }
])

关键阶段说明:

  • $unwind:将含多类别的文档拆分为单个类别文档,比如一个文档有["科技","娱乐"]两个类别,会拆成两个独立文档,才能统计每个类别的出现次数。
  • 两次$match:第一次筛选包含目标类别的文档,第二次过滤拆分后混入的无关类别。
  • 两次$group:先按小时+类别统计单类别次数,再按小时汇总,同时得到该小时的类别明细和总计数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:45:14