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
相关产品推荐
相关产品推荐

