本文档中的示例使用该zipcodes集合。该集合位于:media.mongodb.org/zips.json。用于mongoimport将该数据集加载到您的mongod实例中。
zipcodes集合中的每个文档都具有以下格式:
_id字段将邮政编码保存为字符串。city字段包含城市名称。一个城市可以具有多个与之相关的邮政编码,因为该城市的不同部分可以分别具有不同的邮政编码。state字段包含两个字母的州缩写。pop领域拥有人口。loc字段将位置保存为经度纬度对。aggregate()方法¶以下所有示例均aggregate()在mongoShell中使用辅助程序。
该aggregate()方法使用
汇总管道将文档处理为汇总结果。一个聚集管道由阶段有每个阶段处理的文件,因为它们沿管道传递。文档依次经过各个阶段。
Shell中的aggregate()方法
mongo为aggregate数据库命令提供了包装
。有关用于数据聚合操作的更惯用的界面,请参见驱动程序的文档
。
以下汇总操作将返回总人口超过1000万的所有州:
在此示例中,聚合管道
包括$group以下
$match阶段:
该$group阶段zipcode
按state字段将集合的文档分组,totalPop为每个状态计算字段,并为每个唯一状态输出文档。
新的按状态的文档有两个字段:_id字段和totalPop字段。该_id字段包含state; 的值
;即按字段分组。该totalPop字段是包含每个州的总人口的计算字段。要计算该值,请$group使用$sum
运算符pop为每个州添加人口字段()。
在该$group阶段之后,管道中的文档类似于以下内容:
该$match阶段过滤这些分组的文档以仅输出totalPop值大于或等于1000万的那些文档。该$match阶段不会更改匹配的文档,但会输出未修改的匹配文档。
此聚合操作的等效SQL为:
以下汇总操作返回每个州的城市平均人口:
在这个例子中,聚集管道
由的$group阶段,接着是另一个
$group阶段:
第一$group阶段通过组的组合的文件city和state,使用$sum
表达式来计算的人口为每个组合,并且输出对于每个文档city和state组合。
[1]
在管道中的此阶段之后,文档类似于以下内容:
第二$group阶段按_id.state字段(即文档state内部的字段_id)对管道中的文档进行分组,使用$avg表达式计算avgCityPop每个州的平均城市人口(),并输出每个州的文档。
此聚合操作产生的文档类似于以下内容:
以下汇总操作将按人口返回每个州的最小和最大城市:
在此示例中,聚合管道
由一个$group阶段,一个$sort阶段,另一个$group阶段和一个$project阶段组成:
第一$group阶段通过组的组合中的文件city和state,计算sum所述的pop值对于每个组合,并且输出对于每个文档city和state组合。
在管道的此阶段,文档类似于以下内容:
该$sort阶段订单管道由文件pop字段值,从最小到最大; 即通过增加顺序。此操作不会更改文档。
下一$group阶段按_id.state字段(即文档state内部的字段
_id)对现在分类的文档进行分组,并为每个状态输出文档。
该阶段还将为每个状态计算以下四个字段。使用$last表达式,$group操作员创建biggestCity和biggestPop字段,用于存储人口最多的城市和该人口。使用
$first表达式,$group操作员创建smallestCity和smallestPop字段,用于存储人口最少的城市和该人口。
在管道的此阶段,这些文档类似于以下内容:
最后$project阶段重命名_id字段
state和移动biggestCity,biggestPop,
smallestCity,和smallestPop成biggestCity和
smallestCity嵌入文档。
此聚合操作的输出文档类似于以下内容:
| [1] | 一个城市可以具有多个与之相关的邮政编码,因为该城市的不同部分可以分别具有不同的邮政编码。 |