使用 Zip Code 数据集进行聚合

在本页面

本文档中的示例使用zipcodes集合。该系列可在以下网址获得:media.mongodb.org/zips.jsonarrow-up-right。使用mongoimportarrow-up-right将此数据集加载到mongodarrow-up-right实例中。

数据模型

zipcodes集合中的每个文档都具有以下形式:

{
  "_id": "10280",
  "city": "NEW YORK",
  "state": "NY",
  "pop": 5574,
  "loc": [
    -74.016323,
    40.710537
  ]
}
  • _id字段将 zip code 保存为 string。

  • city字段包含 city name。一个城市可以有多个与之关联的 zip code,因为城市的不同部分可以各自具有不同的 zip code。

  • state字段包含两个字母 state 缩写。

  • pop字段包含人口。

  • loc字段将位置保存为纬度经度对。

aggregate()方法

以下所有示例都使用mongoarrow-up-right shell 中的aggregate()arrow-up-right帮助程序。

aggregate()arrow-up-right方法使用聚合管道arrow-up-right将文档处理为聚合结果。 聚合管道arrow-up-right多个阶段arrow-up-right组成,每个阶段在文档沿着管道传递时都会对其进行处理。文档按顺序通过各个阶段。

mongoarrow-up-right shell 中的aggregate()arrow-up-right方法在聚合arrow-up-right数据库命令提供了一个包装器。有关用于数据聚合操作的更惯用的界面,请参阅驱动arrow-up-right的文档。

返回人口超过 1000 万的国家

以下聚合操作将返回总人口超过 1000 万的所有州:

在此 example 中,聚合管道arrow-up-right包含$grouparrow-up-right阶段,后跟$matcharrow-up-right阶段:

  • 阶段按state字段对zipcode集合的文档进行分组,为每个 state 计算totalPop字段,并为每个唯一的 state 输出文档。

    新的 per-state 文档有两个字段:_id字段和totalPop字段。 _id字段包含state的 value即: group by field。 totalPop字段是一个计算字段,包含每个 state 的总人口。要计算 value,$grouparrow-up-right使用$sumarrow-up-right operator 为每个 state 添加填充字段(pop)。

    $grouparrow-up-right阶段之后,管道中的文档类似于以下内容:

  • $matcharrow-up-right阶段过滤这些分组文档,仅输出totalPop value 大于或等于 1000 万的文档。 $matcharrow-up-right阶段不会更改匹配的文档,但会不加修改地输出匹配的文档。

此聚合操作的等效SQLarrow-up-right是:

[success] 也可以看看

$grouparrow-up-right$matcharrow-up-right$sumarrow-up-right

按 State 返回平均城市人口

以下聚合操作返回每个 state 中城市的平均人口数:

在这个 example 中,聚合管道arrow-up-right包含$grouparrow-up-right阶段,后跟另一个$grouparrow-up-right阶段:

  • 第一个阶段通过citystate的组合对文档进行分组,使用$sumarrow-up-right表达式计算每个组合的总体,并为每个citystate组合输出一个文档。 [1]

    在管道中的这个阶段之后,文档类似于以下内容:

  • 第二个$grouparrow-up-right阶段通过_id.state字段(i.e._id文档中的state字段)对管道中的文档进行分组,使用$avgarrow-up-right表达式计算每个 state 的平均城市人口(avgCityPop),并为每个 state 输出一个文档。

此聚合操作产生的文档类似于以下内容:

[success] 也可以看看

$grouparrow-up-right$sumarrow-up-right$avgarrow-up-right

按 State 返回最大和最小城市

以下聚合操作按每个 state 的填充返回最小和最大的城市:

在此 example 中,聚合管道arrow-up-right包含$grouparrow-up-right阶段,$sort阶段,另一个$grouparrow-up-right阶段和$project阶段:

  • 第一个$grouparrow-up-right阶段通过citystate的组合对文档进行分组,计算每个组合的pop值的arrow-up-right,并为每个citystate组合输出一个文档。

    在管道的这个阶段,文档类似于以下内容:

  • $sortarrow-up-right阶段通过pop field value 对管道中的文档进行排序,从最小到最大; 即:通过增加 order。此操作不会更改文档。

  • 下一个$grouparrow-up-right阶段按_id.state字段(即:_id文档中的state字段)对 now-sorted 文档进行分组,并为每个 state 输出一个文档。

    该阶段还为每个 state 计算以下四个字段。使用$lastarrow-up-right表达式,$grouparrow-up-right operator 创建biggestCitybiggestPop字段,用于存储人口和人口最多的城市。使用$firstarrow-up-right表达式,$grouparrow-up-right operator 创建smallestCitysmallestPop字段,用于存储人口和人口最少的城市。

    在管道的这个阶段,文件类似于以下内容:

  • 最后的$projectarrow-up-right阶段将_id字段重命名为state,并将biggestCitybiggestPopsmallestCitysmallestPop移动到biggestCitysmallestCity嵌入文档中。

此聚合操作的输出文档类似于以下内容:

[1]

一个城市可以有多个与之关联的 zip code,因为城市的不同部分可以各自具有不同的 zip code。

译者:李冠飞

校对:李冠飞

最后更新于