Los ejemplos de este documento utilizan el zipcodes Colección. Esta colección está disponible en: media.mongodb.org/zips.json. Utiliza mongoimport para cargar este conjunto de datos en tu mongod instancia.
modelo de datos
Cada documento en la colección zipcodes tiene la siguiente forma:
{ "_id": "10280", "city": "NEW YORK", "state": "NY", "pop": 5574, "loc": [ -74.016323, 40.710537 ] }
El campo
_idcontiene el código postal como un string.El campo
citycontiene el nombre de la ciudad. Una ciudad puede tener más de un código postal asociado, ya que diferentes secciones de la ciudad pueden tener un código postal diferente.El campo
statecontiene la abreviatura de dos letras del estado.El campo
popcontiene la población.O campo
locarmazena a ubicación como um par de longitude e latitude.
aggregate() Método
Todos los siguientes ejemplos usan el asistente aggregate() en mongosh.
El método aggregate() utiliza el pipeline de agregación para procesar documentos en resultados agregados. Un pipeline de agregación consta de etapas donde cada una procesa los documentos conforme avanzan a través del pipeline. Los documentos pasan por las etapas en secuencia.
El método aggregate() en mongosh proporciona un contenedor para el comando de base de datos aggregate. Consulte la documentación para su controlador para una interfaz más idiomática para las operaciones de agregación de datos.
Devuelve los estados con poblaciones superiores a 10 millones
La siguiente operación de agregación devuelve todos los estados con una población total superior a 10 millones:
db.zipcodes.aggregate( [ { $group: { _id: "$state", totalPop: { $sum: "$pop" } } }, { $match: { totalPop: { $gte: 10*1000*1000 } } } ] )
En este ejemplo, el pipeline de agregación consta de la etapa $group seguida de la etapa $match:
La etapa
$groupagrupa los documentos de la colecciónzipcodepor el campostate, calcula el campototalPoppara cada estado y genera un documento para cada estado único.Los nuevos documentos por estado tienen dos campos: el campo
_idy el campototalPop. El campo_idcontiene el valor delstate; es decir, el campo por el que se agrupa. El campototalPopes un campo calculado que contiene la población total de cada estado. Para calcular el valor,$grouputiliza el operador$sumpara sumar el campo de población (pop) para cada estado.Después de la etapa
$group, los documentos del pipeline se parecen a lo siguiente:{ "_id" : "AK", "totalPop" : 550043 } La etapa
$matchfiltra estos documentos agrupados para emitir solo aquellos documentos cuyo valortotalPopsea mayor o igual a 10 millones. La etapa$matchno modifica los documentos coincidentes, pero los emite sin cambios.
El SQL equivalente para esta operación de agregación es:
SELECT state, SUM(pop) AS totalPop FROM zipcodes GROUP BY state HAVING totalPop >= (10*1000*1000)
Retorno Población promedio de la ciudad por estado
La siguiente operación de agregación devuelve las poblaciones promedio de las ciudades de cada estado:
db.zipcodes.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } }, { $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } } ] )
En este ejemplo, el pipeline de agregación consta de una etapa $group seguida de otra etapa $group:
La primera etapa de
$groupagrupa los documentos por la combinación decityystate, utiliza la expresión$sumpara calcular la población para cada combinación y genera un documento para cada combinación decityystate. [1]Después de esta etapa del proceso, los documentos se parecen a los siguientes:
{ "_id" : { "state" : "CO", "city" : "EDGEWATER" }, "pop" : 13154 } Una segunda etapa
$groupagrupa los documentos en la pipeline por el campo_id.state(es decir, el campostatedentro del documento_id), utiliza la expresión$avgpara calcular la población promedio de la ciudad (avgCityPop) para cada estado y genera un documento para cada estado.
Los documentos resultantes de esta operación de agregación son los siguientes:
{ "_id" : "MN", "avgCityPop" : 5335 }
Regresar a las ciudades más grandes y más pequeñas por estado
La siguiente operación de agregación devuelve las ciudades más pequeñas y más grandes por población 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" } } } ] )
En este ejemplo, la canalización de agregación consta de una $group etapa, una $sort etapa, otra etapa $group $project y una etapa:
La primera etapa agrupa los documentos por la combinación
$groupdecitystatey, calcula desumlospopvalores para cada combinación y genera un documento para cada combinacióncitystatey.En esta etapa del pipeline, los documentos se parecen a los siguientes:
{ "_id" : { "state" : "CO", "city" : "EDGEWATER" }, "pop" : 13154 } La etapa
$sortordena los documentos en el pipeline por el valor del campopop, de menor a mayor; es decir, en orden creciente. Esta operación no altera los documentos.La siguiente etapa
$groupagrupa los documentos ya ordenados por el campo_id.state(es decir, el campostatedentro del documento_id) y genera un documento para cada estado.La etapa también calcula los siguientes cuatro campos para cada estado. Al utilizar la expresión
$last, el operador$groupcrea los camposbiggestCityybiggestPopque almacenan la ciudad con mayor población y dicha población. Usando la$firstexpresión, el$groupoperador crea los campossmallestCityysmallestPopque almacenan la ciudad con la menor población y esa población.Los documentos, en esta etapa del pipeline, se asemejan a lo siguiente:
{ "_id" : "WA", "biggestCity" : "SEATTLE", "biggestPop" : 520096, "smallestCity" : "BENGE", "smallestPop" : 2 } La última etapa de
$projectcambia el nombre del campo_idastatey mueve los documentosbiggestCity,biggestPop,smallestCityysmallestPopa los documentos incrustadosbiggestCityysmallestCity.
Los documentos de salida de esta operación de agregación se asemejan a lo siguiente:
{ "state" : "RI", "biggestCity" : { "name" : "CRANSTON", "pop" : 176404 }, "smallestCity" : { "name" : "CLAYVILLE", "pop" : 45 } }
| [1] | Una ciudad puede tener más de un código postal asociado, ya que diferentes secciones de la ciudad pueden tener cada una un código postal diferente. |