Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Agregación

En esta guía, puedes aprender a usar operaciones de agregación en el MongoDB Go Driver.

Las operaciones de agregación procesan datos en tus colecciones de MongoDB de acuerdo con tus especificaciones en la pipeline de agregación. Un pipeline de agregación consta de una o más etapas. Cada etapa realiza una operación basada en sus operadores de expresión. Después de que el driver ejecute la pipeline de agregación, devuelve un resultado agregado.

Tip

Tutoriales completos sobre agregación

Puedes encontrar tutoriales que proporcionan explicaciones detalladas de tareas comunes de agregación en la sección Tutoriales completos de canalización de agregación del manual del servidor. Selecciona un tutorial y luego elige Go en el menú desplegable Select your language en la esquina superior derecha de la página.

Las operaciones de agregación funcionan de manera similar a una fábrica de autos. Las fábricas de automóviles tienen una línea de ensamblaje. Las líneas de ensamblaje cuentan con estaciones de ensamblaje y herramientas especializadas para realizar tareas específicas. Para compilar un auto, envía partes sin procesar a la fábrica. Luego, la línea de ensamblaje transforma y ensambla las partes en un automóvil.

La línea de ensamblaje se asemeja al pipeline 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.

La siguiente tabla enumera las tareas que puedes realizar utilizando las operaciones de búsqueda y agregación.

Operaciones de búsqueda
Operaciones de agregación

Seleccione qué documentos devolver
Seleccione qué campos devolver
Ordene los resultados
Limite los resultados
Cuente los resultados

Seleccione qué documentos devolver
Seleccione qué campos devolver
Ordene los resultados
Limite los resultados
Cuente los resultados
Cambie el nombre de los campos
Calcule los campos
Resuma los datos
Agrupe los valores

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 la pipeline tienen un límite de memoria de 100 megabytes por defecto. Si es necesario, puede exceder este límite utilizando el método allowDiskUse().

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

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

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

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

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é, las opciones de topping 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é.

El pipeline 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 el número 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 muestra documentos donde puedes conseguir espuma de leche como topping y enumera las dos opciones más económicas.

El pipeline de agregación contiene las siguientes etapas:

  • $match etapa para hacer coincidir documentos donde el campo toppings contenga "espuma de leche"

  • $unset etapa para omitir los campos _id y category

  • $sort etapa para ordenar el price y el 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, consulta las siguientes guías:

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

Para obtener más información sobre el método Aggregate() 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: