《MongoDB入门教程》第25篇 聚合统计之$avg表达式

《MongoDB入门教程》第25篇 聚合统计之$avg表达式
最新回答
一懒众山小

2023-03-06 14:15:55

MongoDB的$avg表达式用于计算一组数值的平均值,其核心特性及使用方法如下:

一、基本语法与特性
  • 语法格式:{ $avg: <expression> }
  • 数据处理规则

    自动忽略非数字字段(如字符串、布尔值)和缺失值(null/undefined)

    当所有输入均为非数字时返回null

  • 适用场景:常用于$group阶段计算分组平均值,也可与其他表达式嵌套使用
二、典型应用示例示例1:基础平均值计算db.sales.aggregate([ { $group: { _id: "$item", averageQty: { $avg: "$quantity" } } }])

结果解析

  • 按商品名称分组后计算平均销量
  • Americanos:(22+12+21+15)/4=17.5
  • Cappuccino:(12+20+17)/3≈16.33
示例2:复合表达式计算db.sales.aggregate([ { $group: { _id: "$item", averageAmount: { $avg: { $multiply: ["$quantity", "$price"] } } } }, { $sort: { averageAmount: 1 } }])

关键点

  • 使用$multiply先计算每笔订单金额(数量×单价)
  • 结果排序显示Cappuccino平均金额最低(127.33),Lattes最高(562.5)
示例3:带过滤条件的聚合db.sales.aggregate([ { $group: { _id: "$item", averageAmount: { $avg: { $multiply: ["$quantity", "$price"] } } } }, { $match: { averageAmount: { $gt: 150 } } }, { $sort: { averageAmount: 1 } }])

执行逻辑

  1. 先分组计算各商品平均金额
  2. 通过$match筛选出平均金额>150的商品
  3. 最终仅保留Mochas(275)和Lattes(562.5)
三、注意事项
  1. 性能优化:在大型集合上,建议先使用$match过滤数据再计算
  2. 精度问题:浮点数计算可能存在微小精度误差(如示例中的16.333...)
  3. 替代方案:需要加权平均时,可结合$sum和$divide手动实现
四、扩展应用// 计算不同尺寸商品的平均单价db.sales.aggregate([ { $group: { _id: "$size", avgPrice: { $avg: "$price" } } }])// 多字段分组计算db.sales.aggregate([ { $group: { _id: { item: "$item", size: "$size" }, avgQty: { $avg: "$quantity" } } }])

通过灵活组合$avg与其他聚合操作符,可以实现复杂的数据分析需求。建议在实际使用时先通过$limit测试小样本数据,验证计算逻辑后再处理完整数据集。