聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询
MongoDB 的聚合框架就是将文档输入处理管道,在管道内完成对文档的操作,最终将文档转换为聚合结果,MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,管道操作是可以重复的。 最基本的管道阶段提供过滤器,其操作类似查询和文档转换,可以修改输出文档的形式。其他管道操作提供了按特定字段对文档进行分组和排序的工具,以及用于聚合数组内容(包括文档数组)的工具。
db.collection.aggregate()是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
聚合管道方法的流程参见下图
上图的聚合操作相当于 MySQL 中的以下语句:
为了便于理解,先将常见的mongo的聚合操作和mysql的查询做下类比SQL 操作/函数mongodb聚合操作where$matchgroup by$grouphaving$matchselect$projectorder by$sortlimit$limitsum()$sumcount()$sumjoin$lookup$count
返回包含输入到stage的文档的计数,理解为返回与表或视图的find()查询匹配的文档的计数。db.collection.count()方法不执行find()操作,而是计数并返回与查询匹配的结果数。语法
$count阶段相当于下面$group+$project的序列:
查询人数是100000以上的城市的数量
按指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一个阶段。输出文档包含一个_id字段,该字段按键包含不同的组。 输出文档还可以包含计算字段,该字段保存由$group的_id字段分组的一些accumulator表达式的值。 $group不会输出具体的文档而只是统计信息。
$group阶段的内存限制为100M,默认情况下,如果stage超过此限制,$group将产生错误,但是,要允许处理大型数据集,请将allowDiskUse选项设置为true以启用$group操作以写入临时文件。注意:
按照state分组,并计算每一个state分组的总人数,平均人数以及每个分组的数量
查找不重复的所有的state的值
按照city分组,并且分组内的state字段列表加入到stateItem并显示
下面聚合操作使用系统变量$$ROOT按item对文档进行分组,生成的文档不得超过BSON文档大小限制
过滤文档,仅将符合指定条件的文档传递到下一个管道阶段。语法
$match接受一个指定查询条件的文档,查询语法与读操作查询语法相同。
使用 $match做简单的匹配查询,查询缩写是NY的城市数据
使用$match管道选择要处理的文档,然后将结果输出到$group管道以计算文档的计数
从输入文档解构数组字段以输出每个元素的文档,简单说就是 可以将数组拆分为单独的文档。语法
要指定字段路径,在字段名称前加上$符并用引号括起来。
v3.2+支持如下语法
以下聚合使用$unwind为loc数组中的每个元素输出一个文档:
$project可以从文档中选择想要的字段,和不想要的字段(指定的字段可以是来自输入文档或新计算字段的现有字段),也可以通过管道表达式进行一些复杂的操作,例如数学操作,日期操作,字符串操作,逻辑操作。语法
$project 管道符的作用是选择字段(指定字段,添加字段,不显示字段,_id:0,排除字段等),重命名字段,派生字段。
specifications有以下形式:: 是否包含该字段,field:1/0,表示选择/不选择 field
以下$project阶段的输出文档中只包含_id,city和state字段
_id字段默认包含在内。要从$ project阶段的输出文档中排除_id字段,请在project文档中将_id字段设置为0来指定排除_id字段。
以下$ project阶段从输出中排除loc字段
可以在聚合表达式中使用变量REMOVE来有条件地禁止一个字段,
我们还可以改变数据,将人数大于1000的城市坐标重置为0
新增字段列
限制传递到管道中下一阶段的文档数语法
示例,此操作仅返回管道传递给它的前5个文档。 $limit对其传递的文档内容没有影响。
跳过进入stage的指定数量的文档,并将其余文档传递到管道中的下一个阶段语法
示例,此操作将跳过管道传递给它的前5个文档, $skip对沿着管道传递的文档的内容没有影响。
对所有输入文档进行排序,并按排序顺序将它们返回到管道。语法
$sort指定要排序的字段和相应的排序顺序的文档。 可以具有以下值之一:
要对字段进行排序,请将排序顺序设置为1或-1,以分别指定升序或降序排序,如下例所示:
根据指定表达式的值对传入文档分组,然后计算每个不同组中文档的数量。每个输出文档都包含两个字段:包含不同分组值的_id字段和包含属于该分组或类别的文档数的计数字段,文件按降序排列。语法
下面举了一些常用的mongo聚合例子和mysql对比,假设有一条如下的数据库记录(表名:zips)作为例子:统计所有数据
SQL的语法格式如下
mongoDB的语法格式
SQL的语法格式如下
mongoDB的语法格式
SQL的语法格式如下
mongoDB的语法格式
SQL的语法格式如下
mongoDB的语法格式
SQL的语法格式如下
mongoDB的语法格式
本文由传智教育博学谷 - 狂野架构师教研团队发布
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力
转载请注明出处!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |