MongoDB如何通过aggregate统计对象数组字段的count、min、max、avg指标
MongoDB聚合统计查询解决方案
报错原因
你收到的40323错误是因为将$project和$unwind两个聚合阶段写在了同一个对象中,MongoDB要求聚合管道的每个阶段必须是独立的对象,每个对象仅包含一个阶段操作符。
正确聚合查询
db.node_correlations.aggregate([ // 拆分correlatedNodes数组,每个关联类型配置单独成一条文档 { $unwind: "$correlatedNodes" }, // 新增字段存储当前关联类型下nodes数组的长度 { $addFields: { nodeCount: { $size: "$correlatedNodes.nodes" } } }, // 按关联类型分组计算统计指标 { $group: { _id: "$correlatedNodes.type", count: { $sum: "$nodeCount" }, avg: { $avg: "$nodeCount" }, min: { $min: "$nodeCount" }, max: { $max: "$nodeCount" } } }, // 转换为你要求的「类型名为键、统计结果为值」的输出格式 { $group: { _id: null, stats: { $push: { k: "$_id", v: { count: "$count", avg: "$avg", min: "$min", max: "$max" } } } } }, { $replaceRoot: { newRoot: { $arrayToObject: "$stats" } } } ])
阶段说明
$unwind:将数组格式的correlatedNodes拆分为多条独立文档,每条对应一种关联类型配置$addFields:计算当前关联类型下nodes数组的长度,存储为nodeCount字段用于后续统计$group:按correlatedNodes.type分组,分别统计总长度、平均长度、最小长度、最大长度- 最后两个阶段为格式转换逻辑,不需要目标输出格式可以删除,直接保留默认分组结果即可。
样例数据输出
用你提供的4条测试数据运行上述查询,输出结果如下:
{ "IS_ULTIMATELY_CONSOLIDATED_BY": { "count": 4, "avg": 1, "min": 1, "max": 1 }, "IS_DIRECTLY_CONSOLIDATED_BY": { "count": 3, "avg": 1.5, "min": 1, "max": 2 } }
内容的提问来源于stack exchange,提问作者cherro
相关产品推荐
相关产品推荐

