Docs Menu
Docs Home
/ /

Agregación

En esta guía, puede aprender a utilizar operaciones de agregación en el controlador MongoDB Go.

Las operaciones de agregación procesan los datos de sus colecciones de MongoDB según sus especificaciones en la canalización de agregación. Una canalización de agregación consta de una o más etapas. Cada etapa realiza una operación basada en sus operadores de expresión. Una vez que el controlador ejecuta la canalización de agregación, devuelve un resultado agregado.

Tip

Tutoriales completos sobre agregación

Puede encontrar tutoriales que brindan explicaciones detalladas de tareas de agregación comunes en Sección completa de tutoriales decanalización de agregación del manual del servidor. Seleccione un tutorial y luego seleccione Go desde el menú desplegable Select your language en la esquina superior derecha de la página.

Las operaciones de agregación funcionan de forma similar a una fábrica de automóviles. Las fábricas de automóviles cuentan con una línea de montaje. Estas líneas cuentan con estaciones de montaje con herramientas especializadas para realizar una tarea específica. Para fabricar un automóvil, se envían piezas en bruto a la fábrica. Luego, la línea de montaje transforma y ensambla las piezas para formar el automóvil.

La línea de ensamblaje se asemeja a la tubería de agregación, las estaciones de ensamblaje en la línea de ensamblaje se asemejan a las etapas de agregación, las herramientas especializadas representan los operadores de expresión y el producto terminado se asemeja al resultado agregado.

En la siguiente tabla se enumeran las tareas que puede realizar mediante operaciones de búsqueda y agregación.

Operaciones de búsqueda
Operaciones de agregación
Select what documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Select what documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Rename fields
Calculate fields
Summarize data
Group values

Las operaciones de agregación tienen limitaciones. Al realizar operaciones de agregación, tenga en cuenta lo siguiente:

  • Los documentos devueltos no deben violar el límite de tamaño de documento BSON de 16 megabytes.

  • Las etapas de pipeline tienen un límite de memoria de 100 megabytes por defecto. Si es necesario, puede superar este límite con el método allowDiskUse().

  • La etapa $graphLookup tiene un límite de memoria estricto de 100 megabytes e ignora la allowDiskUse configuración.

Los ejemplos de esta sección utilizan la siguiente estructura Tea como modelo para los documentos de la colección tea:

type Tea struct {
Type string
Category string
Toppings []string
Price float32
}

Para ejecutar los ejemplos de esta sección, cargue los datos de muestra en la colección tea de la base de datos db utilizando el siguiente fragmento:

coll := client.Database("db").Collection("tea")
docs := []any{
Tea{Type: "Masala", Category: "black", Toppings: []string{"ginger", "pumpkin spice", "cinnamon"}, Price: 6.75},
Tea{Type: "Gyokuro", Category: "green", Toppings: []string{"berries", "milk foam"}, Price: 5.65},
Tea{Type: "English Breakfast", Category: "black", Toppings: []string{"whipped cream", "honey"}, Price: 5.75},
Tea{Type: "Sencha", Category: "green", Toppings: []string{"lemon", "whipped cream"}, Price: 5.15},
Tea{Type: "Assam", Category: "black", Toppings: []string{"milk foam", "honey", "berries"}, Price: 5.65},
Tea{Type: "Matcha", Category: "green", Toppings: []string{"whipped cream", "honey"}, Price: 6.45},
Tea{Type: "Earl Grey", Category: "black", Toppings: []string{"milk foam", "pumpkin spice"}, Price: 6.15},
Tea{Type: "Hojicha", Category: "green", Toppings: []string{"lemon", "ginger", "milk foam"}, Price: 5.55},
}
result, err := coll.InsertMany(context.TODO(), docs)

Cada documento contiene información sobre el tipo de té, los ingredientes disponibles y el precio.

El siguiente ejemplo calcula y muestra la calificación promedio y el número de calificaciones para cada categoría de té.

La canalización de agregación utiliza la etapa $group para agrupar los documentos por el campo category, calcula el promedio utilizando el operador de expresión $avg y cuenta la cantidad de documentos utilizando el operador de expresión $sum.

groupStage := bson.D{
{"$group", bson.D{
{"_id", "$category"},
{"average_price", bson.D{{"$avg", "$price"}}},
{"type_total", bson.D{{"$sum", 1}}},
}}}
// Performs the aggregation and prints the results
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{groupStage})
if err != nil {
panic(err)
}
var results []bson.M
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Printf("Average price of %v tea options: $%v \n", result["_id"], result["average_price"])
fmt.Printf("Number of %v tea options: %v \n\n", result["_id"], result["type_total"])
}
Average price of black tea options: $6.075
Number of black tea options: 4
Average price of green tea options: $5.70
Number of green tea options: 4

El siguiente ejemplo compara documentos donde puedes conseguir espuma de leche como aderezo y enumera las dos opciones más económicas.

El proceso de agregación contiene las siguientes etapas:

  • $match Etapa para hacer coincidir documentos donde el campo toppings contiene "espuma de leche"

  • $unset etapa para omitir los campos _id y category

  • $sort Etapa para ordenar price y toppings en orden ascendente

  • $limit escenario para mostrar los dos primeros documentos

matchStage := bson.D{{"$match", bson.D{{"toppings", "milk foam"}}}}
unsetStage := bson.D{{"$unset", bson.A{"_id", "category"}}}
sortStage := bson.D{{"$sort", bson.D{{"price", 1}, {"toppings", 1}}}}
limitStage := bson.D{{"$limit", 2}}
// Performs the aggregation and prints the results
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage, unsetStage, sortStage, limitStage})
if err != nil {
panic(err)
}
var results []Tea
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Printf("Tea: %v \nToppings: %v \nPrice: $%v \n\n", result.Type, strings.Join(result.Toppings, ", "), result.Price)
}
Tea: Hojicha
Toppings: lemon, ginger, milk foam
Price: $5.55
Tea: Gyokuro
Toppings: berries, milk foam
Price: $5.65

Para obtener más información sobre los términos mencionados, consulte las siguientes guías:

Para ver más ejemplos de agregación, consulte las siguientes guías:

  • Contar

  • Limit

  • Omitir

  • Text

Para obtener más información sobre el Aggregate() método y su comportamiento,consulte Recuperar datos.

Para obtener más información sobre cualquiera de los métodos o tipos discutidos en esta guía, consultar la siguiente documentación de la API:

Volver

Tutorial: Crear una aplicación web

En esta página