MongoDB分组聚合时如何在同一管道中获取总数据条数
解决方案:使用$facet阶段实现单管道聚合
可以通过MongoDB的$facet阶段在单个聚合管道内同时完成总条数统计和按source分组聚合两个操作,之后再将结果重组为你需要的格式。
完整聚合管道代码
db.collection.aggregate([ // 并行执行两个聚合分支 { $facet: { // 统计所有水果的总条数 totalCount: [ { $count: "value" } ], // 原有按source分组的聚合逻辑 groupedResult: [ { $group: { _id: "$source", number_of_important_fruits: { $sum: { $cond: [{ $eq: ["$is_fruit_important", "true"] }, 1, 0] } }, objects: { $push: { fruit: "$fruit", id: "$_id", is_fruit_important: "$is_fruit_important", source: "$source" } } } }, { $project: { _id: 0, count: { number_of_important_fruits: "$number_of_important_fruits" }, objects: 1, source: { "source-of": "$_id" } } } ] } }, // 重组结果格式 { $project: { "total-count": { $arrayElemAt: ["$totalCount.value", 0] }, result: "$groupedResult" } } ])
代码说明
- $facet阶段:在一个管道内同时运行两个独立聚合流程:
totalCount分支:用$count直接统计集合内所有文档总数;groupedResult分支:保留你原本按source分组、统计重要水果数量、重组字段的逻辑。
- $project阶段:将
facet输出的结果整理成目标格式,通过$arrayElemAt提取总条数(因为$count返回数组格式),同时把分组结果赋值给result字段。
最终输出结果
{ "total-count": 2, "result": [ { "count": { "number_of_important_fruits": 1 }, "objects": [ { "fruit": "apple", "id": ObjectId("63ce93ffb6e06322db59fdc0"), "is_fruit_important": "true", "source": "tree" }, { "fruit": "orange", "id": ObjectId("63ce93ffb6e06322db59fdc1"), "is_fruit_important": "false", "source": "tree" } ], "source": { "source-of": "tree" } } ] }
内容的提问来源于stack exchange,提问作者Fatih Ersoy
相关产品推荐
相关产品推荐

