mongodb学习笔记 (四)聚合框架
简单的例子
db.live_online_data.aggregate({"$match":{"startTime":{"$gte":1520179200000},"endTime":{"$lte":1520265600000}}},{"$project":{"userOnline":1,"_id":0,"endTime":1}},{"$group":{"_id":"$endTime",count:{$sum:"$userOnline"}}},{"$sort":{"count":1}},{"$limit":10})
1 match
对集合文档进行筛选,可以使用基本的查询条件($in,$lte..)。
在实际使用过程中,要将match放到聚合框架的开始位置,一方面:尽快的将不符合条件的数据排除掉,以少数据量。另一方面,在投射和分组之前使用match查询可以使用索引。
2 project
(1) 提取文档中的字段
如上例中将文档中的userOnline和嗯对Time提取出来,_id 不提取。
(2) 重命名字段
如下例中,将userOnline 重命名为newuseronline.
db.live_online_data.aggregate({{"$project":{"newuserOnline":"$userOnlin e"}})
但是需要注意的是:如果原字段建立了索引,那么新命名的字段将不会又索引。
(3) 表达式处理
1. 数字表达式
如下所示,新建立了一个count字段,将user online字段和user leave字段相加赋值给count
db.live_online_data.aggregate({{"$project":{"count":{"$add":["$userOnline","$userleave"]}})
同理还有:
subtract:相减
multiply:想乘
divide:相除
mod:取余
2.日期表达式
如下表达式,新建一个m字段,取值timestamp 的month数值
db.live_online_data.aggregate({{"$project":{"m":{"$month","$timestamp
"}})
同理还有:
year,week,dayofMonth,dayfoweek,datofyear,hour,minute,second
3. 字符串表达式
如下所示,新建一个name字段,取值firstname和lastname字段的组合
db.live_online_data.aggregate({{"$project":{"name":("$concat":["$firstname","$lastname"]}})
同理还有:
substr:截取字节
tolower:返回小写
toUpper:返回大写
4. 逻辑表达式
如下所示,新建一个isBig字段,apple大于banana 则为正数,小于为负数,等于为0
db.live_online_data.aggregate({{"$project":{"isBig":("cmp":["$apple","$banana"]}})
同理还有:
and,or,not
还有两个控制语句:
cond:三目运算符
ifnull:条件判断
3 group
分组:将文档依据特定的字段的不同值进行分组。
如上例所述,将endTime作为分组的以及,并必须将其赋值给_id,分组完成后,我们可以对分组的内容进行相关的操作符操作
(1) 算数操作符:
如上例所述,我们使用$sum 将user online的值赋值给新的变量count,
同理还有:
ave
(2) 极值操作符
min,max,first,last.
(3) 数组操作符
addtoset:将元素添加到集合中
push:将元素添加到数组中
4 unwind
拆分:可以及那个数组中的每一个值拆分为单独的文档。
5 sort
排序
6 limit
返回的数量限制