聚合
聚合操作处理数据记录并返回计算结果。聚合操作组将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。聚合的三种方法:the aggregation pipeline, the map-reduce function, the single purpose aggregation methods
管道
Aggregation Pipeline Stages:
操作 | 意义 | 实例 | 备注 |
---|---|---|---|
$match | 查询已经筛选的文档 | db.c.aggregate([{$match:{name:”JoeSchmoe”,maxTime: { $lt:20},minTime: { $gt: 5 },avgTime: { $gt: 7 }}}]) | 可以配合常规查询操作符使用 |
$project | 从文档中提取字段,重命名字段 | db.users.aggregate([{$project:{‘my_id’:’$_id’,’_id’:0,’age’:1}}]) | 值为0则不提取该键值,重命名使用 ‘new_key’:’$old_key’ |
$addFields | 将新字段加入返回文档 | {$addFields:{‘newTime’:new Date()}} | 3.4 新增 |
$bucket | 数据进行分类 | ||
$limit | 限制文档返回数 | {$limit:5} | |
$skip | 跳过指定数文档 | {$skip:5} | |
$group | 将文档分组 | db.users.aggregate([{$group:{‘_id’:’$age’,’count’:{$sum:1}}}]) | 根 age 分组,(需要使用已经有的 fieldName) |
$sort | 指定字段排序 | {$sort:{“age”:1}} | |
$geoNear | 指定地理位置的有序文档 |
Aggregation Pipeline Operators:
操作 | 意义 | 实例 | 备注 |
---|---|---|---|
$add | 加 | { $add: [,, … ] } | |
$subtract | a减b | { $subtract: [a,b] } | |
$multiply | 乘 | { $multiply: [,, … ] } | |
$divide | a除以b | { $divide: [a,b] } | |
$mod | a除以b的余数 | { $mod: [a,b] } | |
$concat | 链接字符串 | { { $concat: [ , , … ] } | |
$substr | 截取字符串 | { $substr: [ , , ] } | |
$cmp | 比较 | { $substr: [ num1, num2 ] } | num1 = num2 ,return 0; num1 >num2 ,return 1; num1 < num2, return -1 |
$strcasecmp | 比较字符串 | { $strcasecmp: [ string1, string2] } | |
$avg | 均值 | { { $avg: [ ,, … ] } | |
$sum | 累加 | { { $sum: } { /$sum: [ , … ] } | $group 时为当个参数 ; $project 为数组参数 |
$first | 分组第一个值 | { { $first : expression } | |
$last | 分组最后一个值 | { { $last : expression } | |
$max | 分组最大值 | { { $max : expression } | |
$min | 分组最小值 | { { $min : expression } |
技巧:
尽量在管道开始阶段缩减文档和字段;
管道如果不是直接从原本的集合中使用数据,则不能在筛选、排序中使用索引