MongoDB单个查询实现两个$count统计 是否需要使用$facet
问题解答
核心结论
不需要使用$facet实现该需求,使用普通的分组聚合即可完成,性能更优。$facet适用于对同一数据集执行多组独立聚合逻辑的场景,你的需求仅为单维度分类统计,使用$facet属于过度设计,会带来额外的计算开销。
实现方案
你可以通过单次MongoDB聚合查询完成统计,步骤如下:
- 先通过
$match过滤出用户为Emma的记录,缩小计算范围 - 按
type字段分组统计每个类型的记录数 - 可选:转换为你需要的键值对输出格式
完整查询代码
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
相关产品推荐
相关产品推荐

