Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Pipeline de agregación
/ / /

Agregación con el conjunto de datos de códigos postales

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.

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

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

  • El campo pop contiene la población.

  • O campo loc armazena a ubicación como um par de longitude e latitude.

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.

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

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

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, el pipeline de agregación consta de una etapa $group seguida de otra etapa $group:

  • La primera etapa de $group agrupa los documentos por la combinación de city y state, utiliza la expresión $sum para calcular la población para cada combinación y genera un documento para cada combinación de city y state. [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 $sort ordena los documentos en el pipeline por el valor del campo pop, de menor a mayor; es decir, en orden creciente. Esta operación no altera los documentos.

  • La siguiente etapa $group agrupa los documentos ya ordenados por el campo _id.state (es decir, el campo state dentro 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 $group crea los campos biggestCity y biggestPop que almacenan la ciudad con mayor población y dicha población. Usando la $first expresión, el $group operador crea los campos smallestCity y smallestPop que 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 $project cambia el nombre del campo _id a state y mueve los documentos biggestCity, biggestPop, smallestCity y smallestPop a los documentos incrustados biggestCity y smallestCity.

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.

Volver

Colecciones fragmentadas

En esta página