目录
1、查询语法
MongoDB聚合运算过程称为管道(PipeLine),由多个步骤(Stage)组成,具体过程可理解为下图:
- 管道接受原始文档
- 每个步骤对文档进行一系列的运算
- 结果文档输出给下一个步骤
- 步骤结束,输出最终结果
MongoDB聚合查询语法:
db.<集合>.aggregate([<stage1>,<stage2>,<stage3>...<stagen>],{options})
db.<collection>.aggregate()
可以用多个构件创建一个管道,对于一连串的文档进行处理。这些构件包括:筛选操作的$match
、映射操作的
p
r
o
j
e
c
t
、
分
组
操
作
的
‘
project、分组操作的`
project、分组操作的‘group、排序操作的
s
o
r
t
‘
、
限
制
操
作
的
‘
sort`、限制操作的`
sort‘、限制操作的‘limit`、和跳过操作的$skip。
2、常见步骤(Stage)操作符
步骤操作符 | 作用 | sql等价操作符 |
---|---|---|
$match | 过滤 | where |
$project | 投影 | select |
$sort | 排序 | ORDER BY |
$group | 分组 | GROUP BY |
$skip | 跳过进入stage的指定数量的文档 | SKIP |
$limit | 限制传递到管道中下一阶段的文档数 | LIMIT |
$lookup | 左外链接 | LEFT OUTER JOIN |
3、常见步骤(Stage)中的运算符
3.1、$match 过滤操作符中常见函数
$lt
:存在并小于$lte
:存在并小于等于$gt
:存在并大于$gte
:存在并大于等于$ne
:不存在或者存在不等于$in
:存在并在指定数组中$nin
:不存在或不在指定数组中$or
:匹配两个或者多个条件中的一个$and:
匹配全部条件$not:
查询到不匹配表达式的文档
3.2、$group 过滤操作符中常见函数
$multiply
乘法$divide
除法$substract
减法$add
求和$mod
求余数$year
日期中的年份$month
日期中的月份$dayOfMonth
一年中的某一月$hour
日期中的小时$minute
日期中的分中$second
日期中的秒
3.2、$project 过滤操作符中常见函数
$sum
计算总和$avg
计算平均值$push
在结果文档中插入值到一个数组中。$addToSet
在结果文档中插入值到一个数组中,但不创建副本。$first
根据资源文档的排序获取第一个文档数据。$last
根据资源文档的排序获取最后一个文档数据$max
获取集合中所有文档对应值得最大值。$min
获取集合中所有文档对应值得最小值
3、查询示例
- 查询条件范围内的订单数量
db.orders.aggregate({
{$match:{status:"completed",orderDate:{
$gte:ISODate("2019-01-01"),
$lte:ISODate("2019-03-31")}
},
{$group:{
_id:null,//分组字段,为null代表不分组
orderCount:{$sum:1} //总的订单数
}
},
{$project:{
_id:0 //不显示ID,如果不显示指定_id不显示,默认显示ID
}
}
})
- 查询条件范围内的订单总金额
查询2019-02-01至2019-05-1范围内已完成订单的总金额
db.orders.aggregate([
//过滤条件
{$match:{status:"completed",orderDate:{
$gte:ISODate("2019-02-01"),
$lt:ISODate("2019-05-1")
}}},
// 分组
{$group:{
_id:null,
total:{$sum:"$total"}, //查询订单总金额
shippingFee:{$sum:"$shippingFee"}, //运费总金额
count:{$sum:1} //订单数量
}
},
{$project:{
grandTotal:{$add:["$total","$shippingFee"]}, //订单总金额+运费总金额
count:1, //显示订单数量
_id:0 //不显示ID
}}
])
- 查询条件范围内的最大订单金额
db.orders.aggregate([
//过滤条件
{$match:{status:"completed",orderDate:{
$gte:ISODate("2019-02-01"),
$lt:ISODate("2019-05-1")
}}},
// 分组
{$group:{
_id:null,
maxMoney:{$max:"$total"} //查询最大金额
}
},
{$project:{
maxMoney:1,
_id:0 //不显示ID
}}
])