首页/数据/NoSQL 速查/聚合 $facet 一次多面统计
MongoDB99 条

聚合 $facet 一次多面统计

$facet 在同一批输入文档上并行跑多个子管道,一次请求返回多种维度的统计结果,适合仪表盘数据接口。

NoSQL 速查数据更新于 2026-10-12
语法{ $facet: { 名A: [子管道], 名B: [子管道] } }
限制$facet 必须是较后阶段,子管道内不能再出现 $facet/$out 等

示例

示例
db.orders.aggregate([
  { $match: { ts: { $gte: ISODate("2026-10-01T00:00:00Z") } } },
  { $facet: {
      byStatus: [ { $group: { _id: "$status", n: { $sum: 1 } } } ],
      topSkus: [ { $group: { _id: "$sku", qty: { $sum: "$qty" } } }, { $sort: { qty: -1 } }, { $limit: 5 } ]
  } }
])
子管道相互独立:各自从头处理同一批输入,注意整体内存开销。

易错点

  • $facet 输入阶段文档量过大时会放大内存与时间开销,尽量先 $match 收敛

数据来源与参考

  • MongoDB Manual: $facet
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌