MongoDB 不专业指北(七):使用聚合函数计数、求和和求平均值

2,295 阅读2分钟

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

聚合操作处理数据记录并返回对应的计算结果。聚合操作从多个文档中获取组合值,可以对多种数据进行处理而只返回单个结果。MongoDB 提供了三种方式完成聚合:聚合管道,map-reduce 函数和单个用途的聚合方法。本篇介绍基础的统计聚合函数。

count 计数

在 MySQL 中我们通常使用 SELECT count(*) FROM table_name WHERE ... 来获取满足某个条件的记录条数。在 MondoDB 中还提供了类似的方法。MongoDB 有如下方式:

db.collection.count({条件});
db.collection.find({条件}).length();

以下面的数据为例:

[
  {
    "gender" : "男",
    "name" : "Tom",
    "age": 10,
  },
  {
    "gender" : "男",
    "name" : "Jack",
    "age": 12,
  },
  {
    "gender" : "男",
    "name" : "Jim",
    "age": 15,
  },
  {
    "gender" : "男",
    "name" : "Jimmy",
    "age": 18,
  },
  {
    "name" : "Mary",
    "gender" : "女",
    "age": 10
  }
]

查找男性的用户数量可以这样做:

db.users.count({gender: '男'});
db.users.find({gender: '男'}).length();

如果要实现条件查询呢,使用条件即可,比如查询性别为男,年龄大于等于15的用户:

db.users.count({
  $and: [
  	{gender: '男'},
  	{age: {$gte: 15}}
  ]
});

条件的时候和之前条件查询的用法一样,可以参考:MongoDB 不专业指北(五):条件查询和排序。 MongoDB 同样提供了分组计数的方法。比如要统计男女性别的人数,可以按如下方式进行:

db.users.aggregate(
  [
    {
      $group: {
        _id: '$gender', 
        count:{$sum: 1}
      }
    }
  ]
 );

求和

求和通过聚合的$sum 操作符来完成,可以用来计算某一个数值列的和,例如我们要计算所有年龄之和。

db.users.aggregate(
  [
    {
      $group: {
        _id: null,
      	totalAge: {$sum: '$age'}
      }
    }
  ]
); 

这里_id 指定为 null 是就是对全部数据进行求和(即不分组),若指定了列,则可以分组求和,比如对男性和女性分别求和。

db.users.aggregate(
  [
    {
      $group: {
        _id: '$gender',
      	totalAge: {$sum: '$age'}
      }
    }
  ]
); 

求和也可以对多个字段进行求和,以下面的外卖订单数据为例:

[
  {
    "goods_name" : "芹菜香干",
    "express_fee" : 3,
    "amount": 10.5,
  },
  {
    "goods_name" : "米饭",
    "express_fee" : 0,
    "amount": 3,
  },
  {
    "goods_name" : "鱼香茄子",
    "express_fee" : 2,
    "amount": 15.5,
  },
  {
    "goods_name" : "酸菜鱼",
    "express_fee" : 3,
    "amount": 48,
  },
]

我们想知道算上配送费的订单总额,可以像下面那样做,如果我们加上商品名称也可以得到每个商品的销售总额。

db.orders.aggregate(   
  [     
    {       
      $group: {        
        _id: null,       
        totalAmount: {
          $sum: {
            $sum:['$amount', '$express_fee']
          }
        }     
      }
    }   
  ] 
);

平均值

平均值通过$avg 操作符完成,例如上面数据的计算平均客单价:

db.orders.aggregate(   
  [     
    {       
      $group: {        
        _id: null,       
        avgAmount: {
          $avg: {
            $sum:['$amount', '$express_fee']
          }
        }     
      }
    }   
  ] 
);

总结

本篇介绍了 MongoDB 的聚合函数的基本用法,包括计数、求和和取平均值。通过 MongoDB 提供了聚合函数可以高效地完成统计工作。