如何编写MongoDB聚合管道,同时返回过滤文档及平均值统计
MongoDB聚合管道实现方案
可以通过$facet阶段同时实现过滤文档列表和计算平均值的需求,以下是具体的聚合管道代码:
db.collection.aggregate([ // 筛选出A > 100的文档 { $match: { A: { $gt: 100 } } }, // 并行执行两个子管道,分别获取文档列表和平均值 { $facet: { // 子管道1:返回过滤后的完整文档列表(可通过$project调整返回字段) filtered_docs: [], // 子管道2:计算符合条件文档的A字段平均值 avg_value: [ { $group: { _id: null, average_A: { $avg: "$A" } } }, { $project: { _id: 0 } } ] } }, // 将平均值数组转为单个对象(可选,优化结果结构) { $addFields: { avg_value: { $arrayElemAt: ["$avg_value", 0] } } } ])
结果示例
执行后返回的结构如下:
{ "filtered_docs": [ { "_id": ObjectId("xxx"), "A": 120 }, { "_id": ObjectId("yyy"), "A": 150 }, // ... 其他符合条件的文档 ], "avg_value": { "average_A": 135 } }
步骤说明
$match:先过滤出符合A > 100条件的文档,减少后续计算的数据量。$facet:支持在同一管道中并行处理多个子任务,分别生成文档列表和平均值统计结果。$arrayElemAt:由于$group返回的是数组格式的结果,用该操作符提取出单个平均值对象,让结果更直观。
若不需要优化平均值的结构,可省略最后一步的$addFields,此时avg_value会是包含单个对象的数组。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

