Os exemplos neste documento usam a coleta zipcodes. Essa coleção está disponível em: media.mongodb.org/zips.json. Utilize o mongoimport para carregar este conjunto de dados na sua instância do mongod.
Modelo de dados
Cada documento na coleção zipcodes tem o seguinte formato:
{ "_id": "10280", "city": "NEW YORK", "state": "NY", "pop": 5574, "loc": [ -74.016323, 40.710537 ] }
O campo
_idmantém o código postal como uma string.O campo
citycontém o nome da cidade. Uma cidade pode ter mais de um CEP associado a ela, pois diferentes seções da cidade podem ter um CEP diferente.O campo
statecontém a abreviação de estado de duas letras.O campo
popcontém a população.O campo
loccontém a localização como um par de latitude e longitude.
aggregate() Método
Todos os exemplos a seguir usam o auxiliar aggregate() no mongosh.
O método aggregate() utiliza o pipeline de agregação para processar documentos em resultados agregados. Um pipeline de agregação consiste em stages, cada estágio processando os documentos à medida que eles passam pelo pipeline. Os documentos passam pelas etapas em sequência.
O método aggregate() em mongosh fornece um encapsulador para o comando de banco de dados aggregate. Consulte a documentação de seu driver para obter uma interface mais idiomática para operações de agregação de dados.
Retornar estados com populações acima de 10 milhões
A seguinte operação de aggregation retorna todos os estados com população total superior a 10 milhões:
db.zipcodes.aggregate( [ { $group: { _id: "$state", totalPop: { $sum: "$pop" } } }, { $match: { totalPop: { $gte: 10*1000*1000 } } } ] )
Neste exemplo, o pipeline de agregação consiste no estágio $group seguido pelo estágio $match:
O estágio
$groupagrupa os documentos da coleçãozipcodepelo campostate, calcula o campototalPoppara cada estado e gera um documento para cada estado exclusivo.Os novos documentos por estado têm dois campos: o campo
_ide o campototalPop. O campo_idcontém o valor destate, ou seja, o grupo por campo. O campototalPopé um campo calculado que contém a população total de cada estado. Para calcular o valor,$grouputiliza o operador$sumpara adicionar o campo de população (pop) para cada estado.Após a etapa
$group, os documentos no pipeline se assemelham ao seguinte:{ "_id" : "AK", "totalPop" : 550043 } O estágio
$matchfiltra esses documentos agrupados para produzir apenas os documentos cujo valortotalPopé maior ou igual a 10 milhões. O estágio$matchnão altera os documentos correspondentes, mas produz os documentos correspondentes sem modificações.
O SQL equivalente para esta operação de agregação é:
SELECT state, SUM(pop) AS totalPop FROM zipcodes GROUP BY state HAVING totalPop >= (10*1000*1000)
Retornar a população média da cidade por estado
A seguinte operação de aggregation retorna as populações médias para as cidades em cada estado:
db.zipcodes.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } }, { $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } } ] )
Neste exemplo, o pipeline de agregação consiste no estágio $group seguido por outro estágio $group:
A primeira etapa
$groupagrupa os documentos pela combinação decityestate, utiliza a expressão$sumpara calcular a população para cada combinação e gera um documento para cada combinaçãocityestate. [1]Após esse estágio no pipeline, os documentos se parecem com o seguinte:
{ "_id" : { "state" : "CO", "city" : "EDGEWATER" }, "pop" : 13154 } Um segundo estágio
$groupagrupa os documentos no pipeline pelo campo_id.state(ou seja, o campostatedentro do documento_id), usa a expressão$avgpara calcular a população média da cidade (avgCityPop) para cada estado e gera um documento para cada estado.
Os documentos resultantes desta operação de aggregation se parecem com o seguinte:
{ "_id" : "MN", "avgCityPop" : 5335 }
Retornar as maiores e menores cidades por estado
A seguinte operação de aggregation retorna as menores e maiores cidades por população para cada estado:
db.zipcodes.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } }, { $sort: { pop: 1 } }, { $group: { _id : "$_id.state", biggestCity: { $last: "$_id.city" }, biggestPop: { $last: "$pop" }, smallestCity: { $first: "$_id.city" }, smallestPop: { $first: "$pop" } } }, // the following $project is optional, and // modifies the output format. { $project: { _id: 0, state: "$_id", biggestCity: { name: "$biggestCity", pop: "$biggestPop" }, smallestCity: { name: "$smallestCity", pop: "$smallestPop" } } } ] )
Neste exemplo, o pipeline de agregação consiste em um estágio $group, um estágio $sort, outro estágio $group e um estágio $project:
O primeiro stage
$groupgrupos os documents pela combination decityestate, calculates osumdospopvalores para cada combination e outputs um document para cadacityestatecombination.Nesse estágio no pipeline, os documentos se parecem com o seguinte:
{ "_id" : { "state" : "CO", "city" : "EDGEWATER" }, "pop" : 13154 } O estágio
$sortordena os documentos no pipeline pelo valor de campopop, do menor para o maior, ou seja, pelo aumento do pedido. Essa operação não altera os documentos.O próximo estágio
$groupagrupa os documentos agora classificados pelo campo_id.state(ou seja, o campostatedentro do documento_id) e gera um documento para cada estado.O estágio também calcula os quatro campos seguintes para cada estado. Utilizando a expressão
$last, o operador$groupcria os camposbiggestCityebiggestPopque armazenam a cidade com a maior população e essa população. Utilizando a expressão$first, o operador$groupcria os campossmallestCityesmallestPopque armazenam a cidade com a população mais pequena e essa população.Os documentos, nesta etapa do pipeline, se assemelham ao seguinte:
{ "_id" : "WA", "biggestCity" : "SEATTLE", "biggestPop" : 520096, "smallestCity" : "BENGE", "smallestPop" : 2 } O estágio final
$projectrenomeia o campo_idparastatee move os documentos incorporadosbiggestCity,biggestPop,smallestCityesmallestPopparabiggestCityesmallestCity.
Os documentos de saída desta operação de agregação se assemelham ao seguinte:
{ "state" : "RI", "biggestCity" : { "name" : "CRANSTON", "pop" : 176404 }, "smallestCity" : { "name" : "CLAYVILLE", "pop" : 45 } }
| [1] | Uma cidade pode ter mais de um CEP associado a ela, pois diferentes seções da cidade podem ter um CEP diferente. |