使用聚合框架可以对集合中的文档进行变换和组合,用多个构件创建一个管道,用于对一连串的文档进行处理!构件包括筛选(filtering
), 投射(projecting),分组(grouping),排序(sorting),限制(limiting)和跳过(skipping)等
使用方法是使用aggregate函数
# 语法:
db.col.aggregate({"$构件": {"字段名": 1}})
①:"$project"的使用
这个方法是使用类似于查询中的字段选择器 --> db.col.find({"xx":"xxx"}, {"name":1, "age":1, "gender": 0})
例:
②:"$group"的使用
这个方法会按照指定字段分组,由"_id"指定
例:如果按下面使用方式,加上count的话,表示如果zone对应的名字出现一次,就会对其加1
③:"$sort"的使用
这个方法会根据指定字段排序(正序1或者倒序-1),和使用sort方法一样
例:
④:"$limit"的使用
这个方法会指定数量返回,和limit方法一样
例:
综合使用上述构件如下:
例:
****************************************************************************************************************************************************************************************************************************************
以上为几个构件的简单使用,构件还可以有更加复杂的用法
一:"$project"
(1) 管道表达式
就是上面的使用方式
(2) 数学表达式
操作符:"$add" 接收一个或多个表达式,将这些表达式相加
"$subtract" 接收两个表达式,用第一个表达式减去第二个表达式作为结果
"$multiply" 接收一个或多个表达式,将其相乘
"$divide" 接收两个表达式,用第一个除以第二个商作为结果
"$mod" 接收两个表达式,用第一个除以第二个余数作为结果
(3)日期表达式
操作符: "$year" 提取年份
"$month" 提取月份
"$week" 提取周
"$dayOfMonth" 提取月中的第几天
"$dayOfWeek" 提取周中的第几天
"$dayOfYyear" 提取年中的第几天
"$hour" 提取小时
"$minute" 提取分钟
"$second" 提取秒
(4)字符串表达式
操作符 :"$substr" 截取字符串
"$concat" 将给定表达式中字符串连接在一起
"$toLower" 返回小写形式
"$toUpper" 返回大写形式
(5) 逻辑表达式
操作符: "$cmp" 比较两个值,前者大返回正数,反之,返回负数
"$strcasecmp" 比较两个字符串
"$eq/ne/gt/gte/lt/lte" 比较两个值,返回大的值
"$and" 如果所有表达式值都是true,则返回true,反之,返回false
"$or" 只要有任意表达式值是true,则返回true
"$not" 对表达式取反
二:"$group"
(1) 分组操作符,上面所述
(2) 算术操作符:
"$sum" 计算总出现次数
"$avg": 计算平均值
(3) 极值操作符
"$max" 最大值
"$min" 最小值
"$first" 第一个值
"$last" 最后一个值
(4)数组操作符
"$addToSet" 如果表达式不包含在当前数组中,则添加
"$push" 不管是是什么值都添加到数组中
三,"$unwind" 将数组中的每一个值拆分为单独的文档,例如,有一篇拥有多条评论的文章,可以使用其将每条评论拆分为独立的文档
数据格式:{"_id": xx, "post": "hello", "author": "xx", "comments": [{}, {}, {}]}
#语法:
db.xx.aggregate({"$unwind": "$comments"})