Los ejemplos de este documento utilizan el zipcodes Colección. Esta colección está disponible en: media.mongodb.org/zips.jsonUtilice para cargar este conjunto de datos en mongoimport su mongod instancia.
Modelo de datos
Cada documento de la colección zipcodes tiene el siguiente formato:
{ "_id": "10280", "city": "NEW YORK", "state": "NY", "pop": 5574, "loc": [ -74.016323, 40.710537 ] }
El campo
_idcontiene el código postal como una cadena.El campo
citycontiene el nombre de la ciudad. Una ciudad puede tener más de un código postal asociado, ya que cada sección de la ciudad puede tener un código postal diferente.El campo
statecontiene la abreviatura de dos letras del estado.El campo
popcontiene la población.El campo
loccontiene la ubicación como un par de longitud y latitud.
aggregate() Método
Todos los ejemplos siguientes utilizan el aggregate() ayudante mongosh en.
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étodoaggregate()enmongoshproporciona una envoltura para el comando de base de datosaggregate. Consulte la documentación de su controlador para obtener una interfaz más idiomática para las operaciones de agregación de datos.
Estados con poblaciones superiores a 10 millones
La siguiente operación de agregación devuelve todos los estados con una población total mayor 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 agrupa los documentos de
$grouplazipcodecolección por elstatecampo, calcula eltotalPopcampo para cada estado y genera un documento para cada estado único.Los nuevos documentos por estado tienen dos campos:
_idtotalPopy. El_idcampo contiene el valorstatede; es decir, el campo "Agrupar por". EltotalPopcampo es un campo calculado que contiene la población total de cada estado. Para calcular el valor,$grouputiliza el operador para sumar el campo de población ()$sumdepopcada estado.Después de la etapa
$group, los documentos del pipeline se parecen a lo siguiente:{ "_id" : "AK", "totalPop" : 550043 } La etapa filtra estos documentos agrupados para generar solo aquellos
$matchcuyototalPopvalor sea mayor o igual a 10 millones. La$matchetapa no altera los documentos coincidentes, sino que los genera sin modificaciones.
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, la canalización de agregación consta de la etapa $group $group seguida de otra etapa:
La primera etapa agrupa los documentos por la combinación
$groupdecitystatey, utiliza la$sumexpresión para calcular la población para cada combinación y genera un documento para cada combinacióncitystatey. []1Despué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 ordena los documentos en la canalización según
$sortelpopvalor del campo, de menor a mayor; es decir, en orden creciente. Esta operación no altera los documentos.La siguiente etapa agrupa los documentos ahora ordenados por
$groupel_id.statecampo (es decir, elstatecampo dentro del_iddocumento) y genera un documento para cada estado.La etapa también calcula los siguientes cuatro campos para cada estado. Mediante la
$lastexpresión, el operador crea$grouplosbiggestCitybiggestPopcampos y que almacenan la ciudad con mayor población y dicha población. Mediante la$firstexpresión, el operador$groupcreasmallestCitylossmallestPopcampos y que almacenan la ciudad con menor población y dicha población.Los documentos, en esta etapa del proceso, se parecen a los siguientes:
{ "_id" : "WA", "biggestCity" : "SEATTLE", "biggestPop" : 520096, "smallestCity" : "BENGE", "smallestPop" : 2 } La
$projectetapa final cambia el_idnombre del campostateabiggestCitybiggestPopysmallestCitymueve,, ysmallestPopabiggestCitylossmallestCitydocumentos incrustados y.
Los documentos de salida de esta operación de agregación se parecen a los siguientes:
{ "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. |