聚合操作处理数据记录并返回对应的计算结果。聚合操作从多个文档中获取组合值,可以对多种数据进行处理而只返回单个结果。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 提供了聚合函数可以高效地完成统计工作。
网友评论