本文档中的示例使用该zipcodes
集合。该集合位于:media.mongodb.org/zips.json。用于mongoimport
将该数据集加载到您的mongod
实例中。
zipcodes
集合中的每个文档都具有以下格式:
_id
字段将邮政编码保存为字符串。city
字段包含城市名称。一个城市可以具有多个与之相关的邮政编码,因为该城市的不同部分可以分别具有不同的邮政编码。state
字段包含两个字母的州缩写。pop
领域拥有人口。loc
字段将位置保存为经度纬度对。aggregate()
方法¶以下所有示例均aggregate()
在mongo
Shell中使用辅助程序。
该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] | 一个城市可以具有多个与之相关的邮政编码,因为该城市的不同部分可以分别具有不同的邮政编码。 |