Docs Menu
Docs Home
/ /
Pipeline de agregación
/ / /

Agregación con el conjunto de datos de código postal

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.

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 _id contiene el código postal como una cadena.

  • El campo city contiene 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 state contiene la abreviatura de dos letras del estado.

  • El campo pop contiene la población.

  • El campo loc contiene la ubicación como un par de longitud y latitud.

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.

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 $group la zipcode colección por el state campo, calcula el totalPop campo para cada estado y genera un documento para cada estado único.

    Los nuevos documentos por estado tienen dos campos:_id totalPop y. El _id campo contiene el valor state de; es decir, el campo "Agrupar por". El totalPop campo es un campo calculado que contiene la población total de cada estado. Para calcular el valor, $group utiliza el operador para sumar el campo de población () $sum depop cada 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 $match cuyo totalPop valor sea mayor o igual a 10 millones. La $match etapa 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)

Tip

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 $group de city statey, utiliza la $sum expresión para calcular la población para cada combinación y genera un documento para cada combinación city state y. []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 $group agrupa los documentos en la pipeline por el campo _id.state (es decir, el campo state dentro del documento _id), utiliza la expresión $avg para 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
}

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 $group de city statey, calcula de sum los pop valores para cada combinación y genera un documento para cada combinación city state y.

    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 $sort el pop valor 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 $group el _id.state campo (es decir, el state campo dentro del _id documento) y genera un documento para cada estado.

    La etapa también calcula los siguientes cuatro campos para cada estado. Mediante la $last expresión, el operador crea $group los biggestCity biggestPop campos y que almacenan la ciudad con mayor población y dicha población. Mediante la $first expresión, el operador $group crea smallestCity los smallestPop campos 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 $project etapa final cambia el _id nombre del campo state a biggestCity biggestPopysmallestCity mueve,, y smallestPop a biggestCity los smallestCity documentos 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.

Volver

Colecciones fragmentadas

En esta página