MongoDB聚合框架
简介
MongoDB 聚合框架(Aggregation Framework)是一个计算框架
1.作用在一个或几个集合上
2.对集合中的数据进行的一系列运算
3.将这些数据转化为期望的形式
从效果而言,聚合框架相当于 SQL 查询里的 GROUP BY,LEFT OUTER JOIN, AS等
管道和步骤
整个聚合运算过程称为管道(Pipeline),它是由多个步骤(Stage)组成的,每个管道:
接受一系列文档(原始数据)
每个步骤对这些文档进行一系列运算
结果文档输出给下一个步骤
聚合运算的基本格式
pipeline = [$stage1, $stage2, ...$stageN];
db.<COLLECTION>.aggregate(
pipeline,
{ options }
);
MQL 常用步骤与 SQL 对比
运算实例
测试数据
# wget https://klcc-img-1251900471.cos.ap-chengdu.myqcloud.com/sql/dump.tar.gz
curl -O -k https://raw.githubusercontent.com/tapdata/geektimemongodb-course/master/aggregation/dump.tar.gz
tar xf dump.tar.gz
# 如果按照上述修改了用户和密码如下导入
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin
# 进入数据库查看
mongo -uroot -proot123 admin
show dbs
use mock
show collections //查看集合
db.orders.findOne() //查看数据
计算
# 计算到目前为止的所有订单总销售额
db.orders.aggregate([
{$group:
{
_id:null, //将整个表做汇总
total: {$sum: "$total"} //total自定义的,"$total"才是数据的字段
}
}
])
// 结果 { "_id" : null, "total" : NumberDecimal("44019609") }
# 查询2019年第一季度(1月1日~3月31日)已完成订单(completed)的订单总金额和订单总数
db.orders.aggregate([
// 步骤1:匹配条件
{ $match: { status: "completed", orderDate: {
$gte: ISODate("2019-01-01"),
$lt: ISODate("2019-04-01") } } },
// 步骤二:聚合订单总金额、总运费、总数量
{ $group: {
_id: null,
total: { $sum: "$total" },
shippingFee: { $sum: "$shippingFee" },
count: { $sum: 1 } } },
{ $project: {
// 计算总金额
grandTotal: { $add: ["$total", "$shippingFee"] },
count: 1,
_id: 0 } }
])
// 结果:
// { "count" : 5875, "grandTotal" : NumberDecimal("2636376.00") }
compass 使用聚合
语句导出不同的开发语言