Docs Menu
Docs Home
/ /
/ / / /

Descomponer arreglos y agrupar datos

Este tutorial ilustra cómo construir un pipeline de agregación, realizar la agregación en una colección y mostrar los resultados utilizando el lenguaje que elijas.

Este tutorial muestra cómo crear perspectivas a partir de los datos de los pedidos de los clientes. Los resultados muestran la lista de productos pedidos cuyo costo es superior a $15. Cada documento contiene la cantidad de unidades vendidas y el valor de venta total de cada producto.

La canalización de agregación realiza las siguientes operaciones:

  • Desglosa un campo de arreglo en documentos separados

  • Coincide un subconjunto de documentos por un valor de campo

  • Agrupa los documentos por valores comunes de campo

  • Añade campos calculados a cada documento de resultado


➤ Usar el menú desplegable Seleccionar lenguaje en la parte superior derecha para establecer el lenguaje de los siguientes ejemplos o seleccionar MongoDB Shell.


Este ejemplo utiliza un orders Colección que contiene documentos que describen los pedidos de productos. Dado que cada pedido contiene varios productos, el primer paso de la agregación descomprime la matriz de productos en documentos de pedidos de productos individuales.

Para crear la colección orders, utilice el insertMany() :

db.orders.deleteMany({})
db.orders.insertMany( [
{
order_id: 6363763262239,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 431
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 22
}
]
},
{
order_id: 1197372932325,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 429
}
]
},
{
order_id: 9812343774839,
products: [
{
prod_id: "pqr88223",
name: "Morphy Richards Food Mixer",
price: 431
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 21
}
]
},
{
order_id: 4433997244387,
products: [
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 23
},
{
prod_id: "jkl77336",
name: "Picky Pencil Sharpener",
price: 1
},
{
prod_id: "xyz11228",
name: "Russell Hobbs Chrome Kettle",
price: 16
}
]
}
] )

Antes de comenzar a seguir este tutorial de agregación, debes configurar una nueva aplicación en C. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador y conectarse a MongoDB, consulte la Comience con la guía del controlador C.

Para obtener más información sobre cómo realizar agregaciones en el controlador C, consulta la Guía de agregación.

Después de instalar el controlador, crea un archivo llamado agg-tutorial.c. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

#include <stdio.h>
#include <bson/bson.h>
#include <mongoc/mongoc.h>
int main(void)
{
mongoc_init();
// Replace the placeholder with your connection string.
char *uri = "<connection string>";
mongoc_client_t* client = mongoc_client_new(uri);
// Get a reference to relevant collections.
// ... mongoc_collection_t *some_coll = mongoc_client_get_collection(client, "agg_tutorials_db", "some_coll");
// ... mongoc_collection_t *another_coll = mongoc_client_get_collection(client, "agg_tutorials_db", "another_coll");
// Delete any existing documents in collections if needed.
// ... {
// ... bson_t *filter = bson_new();
// ... bson_error_t error;
// ... if (!mongoc_collection_delete_many(some_coll, filter, NULL, NULL, &error))
// ... {
// ... fprintf(stderr, "Delete error: %s\n", error.message);
// ... }
// ... bson_destroy(filter);
// ... }
// Insert sample data into the collection or collections.
// ... {
// ... size_t num_docs = ...;
// ... bson_t *docs[num_docs];
// ...
// ... docs[0] = ...;
// ...
// ... bson_error_t error;
// ... if (!mongoc_collection_insert_many(some_coll, (const bson_t **)docs, num_docs, NULL, NULL, &error))
// ... {
// ... fprintf(stderr, "Insert error: %s\n", error.message);
// ... }
// ...
// ... for (int i = 0; i < num_docs; i++)
// ... {
// ... bson_destroy(docs[i]);
// ... }
// ... }
{
const bson_t *doc;
// Add code to create pipeline stages.
bson_t *pipeline = BCON_NEW("pipeline", "[",
// ... Add pipeline stages here.
"]");
// Run the aggregation.
// ... mongoc_cursor_t *results = mongoc_collection_aggregate(some_coll, MONGOC_QUERY_NONE, pipeline, NULL, NULL);
bson_destroy(pipeline);
// Print the aggregation results.
while (mongoc_cursor_next(results, &doc))
{
char *str = bson_as_canonical_extended_json(doc, NULL);
printf("%s\n", str);
bson_free(str);
}
bson_error_t error;
if (mongoc_cursor_error(results, &error))
{
fprintf(stderr, "Aggregation error: %s\n", error.message);
}
mongoc_cursor_destroy(results);
}
// Clean up resources.
// ... mongoc_collection_destroy(some_coll);
mongoc_client_destroy(client);
mongoc_cleanup();
return EXIT_SUCCESS;
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión de la guía de introducción a C++.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

char *uri = "mongodb+srv://mongodb-example:27017";

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

mongoc_collection_t *orders = mongoc_client_get_collection(client, "agg_tutorials_db", "orders");
{
bson_t *filter = bson_new();
bson_error_t error;
if (!mongoc_collection_delete_many(orders, filter, NULL, NULL, &error))
{
fprintf(stderr, "Delete error: %s\n", error.message);
}
bson_destroy(filter);
}
{
size_t num_docs = 4;
bson_t *docs[num_docs];
docs[0] = BCON_NEW(
"order_id", BCON_INT64(6363763262239),
"products", "[",
"{",
"prod_id", BCON_UTF8("abc12345"),
"name", BCON_UTF8("Asus Laptop"),
"price", BCON_INT32(431),
"}",
"{",
"prod_id", BCON_UTF8("def45678"),
"name", BCON_UTF8("Karcher Hose Set"),
"price", BCON_INT32(22),
"}",
"]");
docs[1] = BCON_NEW(
"order_id", BCON_INT64(1197372932325),
"products", "[",
"{",
"prod_id", BCON_UTF8("abc12345"),
"name", BCON_UTF8("Asus Laptop"),
"price", BCON_INT32(429),
"}",
"]");
docs[2] = BCON_NEW(
"order_id", BCON_INT64(9812343774839),
"products", "[",
"{",
"prod_id", BCON_UTF8("pqr88223"),
"name", BCON_UTF8("Morphy Richards Food Mixer"),
"price", BCON_INT32(431),
"}",
"{",
"prod_id", BCON_UTF8("def45678"),
"name", BCON_UTF8("Karcher Hose Set"),
"price", BCON_INT32(21),
"}",
"]");
docs[3] = BCON_NEW(
"order_id", BCON_INT64(4433997244387),
"products", "[",
"{",
"prod_id", BCON_UTF8("def45678"),
"name", BCON_UTF8("Karcher Hose Set"),
"price", BCON_INT32(23),
"}",
"{",
"prod_id", BCON_UTF8("jkl77336"),
"name", BCON_UTF8("Picky Pencil Sharpener"),
"price", BCON_INT32(1),
"}",
"{",
"prod_id", BCON_UTF8("xyz11228"),
"name", BCON_UTF8("Russell Hobbs Chrome Kettle"),
"price", BCON_INT32(16),
"}",
"]");
bson_error_t error;
if (!mongoc_collection_insert_many(orders, (const bson_t **)docs, num_docs, NULL, NULL, &error))
{
fprintf(stderr, "Insert error: %s\n", error.message);
}
for (int i = 0; i < num_docs; i++)
{
bson_destroy(docs[i]);
}
}

Antes de comenzar a seguir un tutorial de agregación, debes configurar una nueva aplicación de C++. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador y conectarte a MongoDB, consulta el tutorial Comienza con C++.

Para obtener más información sobre el uso del controlador C++, consulte la documentación de la API.

Para obtener más información sobre cómo realizar agregaciones en el controlador C++, consulta la guía de agregación.

Después de instalar el controlador, crea un archivo llamado agg-tutorial.cpp. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

#include <iostream>
#include <bsoncxx/builder/basic/document.hpp>
#include <bsoncxx/builder/basic/kvp.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/pipeline.hpp>
#include <mongocxx/uri.hpp>
#include <chrono>
using bsoncxx::builder::basic::kvp;
using bsoncxx::builder::basic::make_document;
using bsoncxx::builder::basic::make_array;
int main() {
mongocxx::instance instance;
// Replace the placeholder with your connection string.
mongocxx::uri uri("<connection string>");
mongocxx::client client(uri);
auto db = client["agg_tutorials_db"];
// Delete existing data in the database, if necessary.
db.drop();
// Get a reference to relevant collections.
// ... auto some_coll = db["..."];
// ... auto another_coll = db["..."];
// Insert sample data into the collection or collections.
// ... some_coll.insert_many(docs);
// Create an empty pipelne.
mongocxx::pipeline pipeline;
// Add code to create pipeline stages.
// pipeline.match(make_document(...));
// Run the aggregation and print the results.
auto cursor = orders.aggregate(pipeline);
for (auto&& doc : cursor) {
std::cout << bsoncxx::to_json(doc, bsoncxx::ExtendedJsonMode::k_relaxed) << std::endl;
}
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión del tutorial de introducción a C++.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

mongocxx::uri uri{"mongodb+srv://mongodb-example:27017"};

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

auto orders = db["orders"];
std::vector<bsoncxx::document::value> order_docs = {
bsoncxx::from_json(R"({
"order_id": 6363763262239,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 431
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 22
}
]
})"),
bsoncxx::from_json(R"({
"order_id": 1197372932325,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 429
}
]
})"),
bsoncxx::from_json(R"({
"order_id": 9812343774839,
"products": [
{
"prod_id": "pqr88223",
"name": "Morphy Richards Food Mixer",
"price": 431
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 21
}
]
})"),
bsoncxx::from_json(R"({
"order_id": 4433997244387,
"products": [
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 23
},
{
"prod_id": "jkl77336",
"name": "Picky Pencil Sharpener",
"price": 1
},
{
"prod_id": "xyz11228",
"name": "Russell Hobbs Chrome Kettle",
"price": 16
}
]
})")
};
orders.insert_many(order_docs); // Might throw an exception

Antes de comenzar a seguir este tutorial de agregación, debes configurar una nueva aplicación de C#/.NET. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador y conectarte a MongoDB, consulta la Guía de inicio rápido del controlador C#/.NET.

Para obtener más información sobre cómo realizar agregaciones en el controlador C#/.NET, consulta la Guía de agregación.

Después de instalar el controlador, pegue el siguiente código en su archivo Program.cs para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

using MongoDB.Driver;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
// Define data model classes.
// ... public class MyClass { ... }
// Replace the placeholder with your connection string.
var uri = "<connection string>";
var client = new MongoClient(uri);
var aggDB = client.GetDatabase("agg_tutorials_db");
// Get a reference to relevant collections.
// ... var someColl = aggDB.GetCollection<MyClass>("someColl");
// ... var anotherColl = aggDB.GetCollection<MyClass>("anotherColl");
// Delete any existing documents in collections if needed.
// ... someColl.DeleteMany(Builders<MyClass>.Filter.Empty);
// Insert sample data into the collection or collections.
// ... someColl.InsertMany(new List<MyClass> { ... });
// Add code to chain pipeline stages to the Aggregate() method.
// ... var results = someColl.Aggregate().Match(...);
// Print the aggregation results.
foreach (var result in results.ToList())
{
Console.WriteLine(result);
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Configurar un clúster de nivel gratuito en Atlas de la guía de inicio rápido de C#.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

var uri = "mongodb+srv://mongodb-example:27017";

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Primero, crea clases de C# para modelar los datos en la colección orders:

public class Order
{
[BsonId]
public ObjectId Id { get; set; }
public long OrderId { get; set; }
public List<Product> Products { get; set; }
}
public class OrderUnwound
{
public long OrderId { get; set; }
public Product Products { get; set; }
}
public class Product
{
public string ProductId { get; set; }
public string Name { get; set; }
public int Price { get; set; }
}

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

var orders = aggDB.GetCollection<Order>("orders");
orders.DeleteMany(Builders<Order>.Filter.Empty);
orders.InsertMany(new List<Order>
{
new Order
{
OrderId = 6363763262239L,
Products = new List<Product>
{
new Product
{
ProductId = "abc12345",
Name = "Asus Laptop",
Price = 431
},
new Product
{
ProductId = "def45678",
Name = "Karcher Hose Set",
Price = 22
}
}
},
new Order
{
OrderId = 1197372932325L,
Products = new List<Product>
{
new Product
{
ProductId = "abc12345",
Name = "Asus Laptop",
Price = 429
}
}
},
new Order
{
OrderId = 9812343774839L,
Products = new List<Product>
{
new Product
{
ProductId = "pqr88223",
Name = "Morphy Richards Food Mixer",
Price = 431
},
new Product
{
ProductId = "def45678",
Name = "Karcher Hose Set",
Price = 21
}
}
},
new Order
{
OrderId = 4433997244387L,
Products = new List<Product>
{
new Product
{
ProductId = "def45678",
Name = "Karcher Hose Set",
Price = 23
},
new Product
{
ProductId = "jkl77336",
Name = "Picky Pencil Sharpener",
Price = 1
},
new Product
{
ProductId = "xyz11228",
Name = "Russell Hobbs Chrome Kettle",
Price = 16
}
}
}
});

Antes de comenzar a seguir este tutorial de agregación, debes configurar una nueva aplicación Go. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador y conectarse a MongoDB, consulte la Guía de inicio rápido del controlador Go.

Para obtener más información sobre cómo realizar agregaciones en el controlador de Go, consulta la Guía de agregación.

Después de instalar el controlador, crea un archivo llamado agg_tutorial.go. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

package main
import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
// Define structs.
// type MyStruct struct { ... }
func main() {
// Replace the placeholder with your connection string.
const uri = "<connection string>"
client, err := mongo.Connect(options.Client().ApplyURI(uri))
if err != nil {
log.Fatal(err)
}
defer func() {
if err = client.Disconnect(context.TODO()); err != nil {
log.Fatal(err)
}
}()
aggDB := client.Database("agg_tutorials_db")
// Get a reference to relevant collections.
// ... someColl := aggDB.Collection("...")
// ... anotherColl := aggDB.Collection("...")
// Delete any existing documents in collections if needed.
// ... someColl.DeleteMany(context.TODO(), bson.D{})
// Insert sample data into the collection or collections.
// ... _, err = someColl.InsertMany(...)
// Add code to create pipeline stages.
// ... myStage := bson.D{{...}}
// Create a pipeline that includes the stages.
// ... pipeline := mongo.Pipeline{...}
// Run the aggregation.
// ... cursor, err := someColl.Aggregate(context.TODO(), pipeline)
if err != nil {
log.Fatal(err)
}
defer func() {
if err := cursor.Close(context.TODO()); err != nil {
log.Fatalf("failed to close cursor: %v", err)
}
}()
// Decode the aggregation results.
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatalf("failed to decode results: %v", err)
}
// Print the aggregation results.
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear un clúster de MongoDB de la guía de inicio rápido de Go.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

const uri = "mongodb+srv://mongodb-example:27017";

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Primero, crea estructuras de Go para modelar los datos en la colección orders:

type Order struct {
OrderID int `bson:"order_id"`
Products []Product `bson:"products"`
}
type Product struct {
ProductID string `bson:"prod_id"`
Name string `bson:"name"`
Price int `bson:"price"`
}

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

orders := aggDB.Collection("orders")
orders.DeleteMany(context.TODO(), bson.D{})
_, err = orders.InsertMany(context.TODO(), []interface{}{
Order{
OrderID: 6363763262239,
Products: []Product{
{ProductID: "abc12345", Name: "Asus Laptop", Price: 431},
{ProductID: "def45678", Name: "Karcher Hose Set", Price: 22},
},
},
Order{
OrderID: 1197372932325,
Products: []Product{
{ProductID: "abc12345", Name: "Asus Laptop", Price: 429},
},
},
Order{
OrderID: 9812343774839,
Products: []Product{
{ProductID: "pqr88223", Name: "Morphy Richards Food Mixer", Price: 431},
{ProductID: "def45678", Name: "Karcher Hose Set", Price: 21},
},
},
Order{
OrderID: 4433997244387,
Products: []Product{
{ProductID: "def45678", Name: "Karcher Hose Set", Price: 23},
{ProductID: "jkl77336", Name: "Picky Pencil Sharpene", Price: 1},
{ProductID: "xyz11228", Name: "Russell Hobbs Chrome Kettle", Price: 16},
},
},
})
if err != nil {
log.Fatal(err)
}

Antes de comenzar a seguir un tutorial de agregación, debes configurar una nueva aplicación de Java. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador y conectarte a MongoDB, consulta la Guía de inicio del controlador de Java.

Para obtener más información sobre cómo realizar agregaciones en el Java Sync Driver, consulta la Guía de agregación.

Después de instalar el controlador, crea un archivo llamado AggTutorial.java. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

package org.example;
// Modify imports for each tutorial as needed.
import com.mongodb.client.*;
import com.mongodb.client.model.Aggregates;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Sorts;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class AggTutorial {
public static void main( String[] args ) {
// Replace the placeholder with your connection string.
String uri = "<connection string>";
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase aggDB = mongoClient.getDatabase("agg_tutorials_db");
// Get a reference to relevant collections.
// ... MongoCollection<Document> someColl = ...
// ... MongoCollection<Document> anotherColl = ...
// Delete any existing documents in collections if needed.
// ... someColl.deleteMany(Filters.empty());
// Insert sample data into the collection or collections.
// ... someColl.insertMany(...);
// Create an empty pipeline array.
List<Bson> pipeline = new ArrayList<>();
// Add code to create pipeline stages.
// ... pipeline.add(...);
// Run the aggregation.
// ... AggregateIterable<Document> aggregationResult = someColl.aggregate(pipeline);
// Print the aggregation results.
for (Document document : aggregationResult) {
System.out.println(document.toJson());
}
}
}
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión de la guía de inicio rápido de Java Sync.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

String uri = "mongodb+srv://mongodb-example:27017";

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

MongoCollection<Document> orders = aggDB.getCollection("orders");
orders.deleteMany(Filters.empty());
orders.insertMany(
Arrays.asList(
new Document("order_id", 6363763262239f)
.append("products", Arrays.asList(
new Document("prod_id", "abc12345")
.append("name", "Asus Laptop")
.append("price", 431),
new Document("prod_id", "def45678")
.append("name", "Karcher Hose Set")
.append("price", 22)
)),
new Document("order_id", 1197372932325f)
.append("products", Collections.singletonList(
new Document("prod_id", "abc12345")
.append("name", "Asus Laptop")
.append("price", 429)
)),
new Document("order_id", 9812343774839f)
.append("products", Arrays.asList(
new Document("prod_id", "pqr88223")
.append("name", "Morphy Richards Food Mixer")
.append("price", 431),
new Document("prod_id", "def45678")
.append("name", "Karcher Hose Set")
.append("price", 21)
)),
new Document("order_id", 4433997244387f)
.append("products", Arrays.asList(
new Document("prod_id", "def45678")
.append("name", "Karcher Hose Set")
.append("price", 23),
new Document("prod_id", "jkl77336")
.append("name", "Picky Pencil Sharpener")
.append("price", 1),
new Document("prod_id", "xyz11228")
.append("name", "Russell Hobbs Chrome Kettle")
.append("price", 16)
))
)
);

Antes de comenzar a seguir un tutorial de agregación, debes configurar una nueva aplicación de Kotlin. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador y conectarte a MongoDB, consulta la Guía de inicio rápido del controlador Kotlin.

Para obtener más información sobre cómo realizar agregaciones en el controlador de Kotlin, consulta la Guía de agregación.

Además del driver, también se deben añadir las siguientes dependencias al archivo de build.gradle.kts y volver a cargar el proyecto:

dependencies {
// Implements Kotlin serialization
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1")
// Implements Kotlin date and time handling
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")
}

Después de instalar el controlador, crea un archivo llamado AggTutorial.kt. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

package org.example
// Modify imports for each tutorial as needed.
import com.mongodb.client.model.*
import com.mongodb.kotlin.client.coroutine.MongoClient
import kotlinx.coroutines.runBlocking
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.toJavaLocalDateTime
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import org.bson.Document
import org.bson.conversions.Bson
// Define data classes.
@Serializable
data class MyClass(
...
)
suspend fun main() {
// Replace the placeholder with your connection string.
val uri = "<connection string>"
MongoClient.create(uri).use { mongoClient ->
val aggDB = mongoClient.getDatabase("agg_tutorials_db")
// Get a reference to relevant collections.
// ... val someColl = ...
// Delete any existing documents in collections if needed.
// ... someColl.deleteMany(empty())
// Insert sample data into the collection or collections.
// ... someColl.insertMany( ... )
// Create an empty pipeline.
val pipeline = mutableListOf<Bson>()
// Add code to create pipeline stages.
// ... pipeline.add(...)
// Run the aggregation.
// ... val aggregationResult = someColl.aggregate<Document>(pipeline)
// Print the aggregation results.
aggregationResult.collect { println(it) }
}
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Conectarte al clúster de la guía de inicio rápido del driver de Kotlin.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

val uri = "mongodb+srv://mongodb-example:27017"

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Primero, cree clases de datos de Kotlin para modelar los datos en la colección orders:

@Serializable
data class Order(
val orderID: Float,
val products: List<Product>
)
@Serializable
data class Product(
val prodID: String,
val name: String,
val price: Int
)

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

val orders = aggDB.getCollection<Order>("orders")
orders.deleteMany(Filters.empty())
orders.insertMany(
listOf(
Order(
6363763262239f, listOf(
Product("abc12345", "Asus Laptop", 431),
Product("def45678", "Karcher Hose Set", 22)
)
),
Order(
1197372932325f, listOf(
Product("abc12345", "Asus Laptop", 429)
)
),
Order(
9812343774839f, listOf(
Product("pqr88223", "Morphy Richards Food Mixer", 431),
Product("def45678", "Karcher Hose Set", 21)
)
),
Order(
4433997244387f, listOf(
Product("def45678", "Karcher Hose Set", 23),
Product("jkl77336", "Picky Pencil Sharpener", 1),
Product("xyz11228", "Russell Hobbs Chrome Kettle", 16)
)
)
)
)

Antes de comenzar a seguir este tutorial de agregación, debes configurar una nueva aplicación de Node.js. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender a instalar el controlador y conectarte a MongoDB, consulta la Guía de inicio rápido del controlador de Node.js.

Para obtener más información sobre cómo realizar agregaciones en el controlador de Nodo.js, consulta la Guía de agregación.

Después de instalar el controlador, crea un archivo llamado agg_tutorial.js. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

const { MongoClient } = require("mongodb");
// Replace the placeholder with your connection string.
const uri = "<connection string>";
const client = new MongoClient(uri);
async function run() {
try {
const aggDB = client.db("agg_tutorials_db");
// Get a reference to relevant collections.
// ... const someColl =
// ... const anotherColl =
// Delete any existing documents in collections.
// ... await someColl.deleteMany({});
// Insert sample data into the collection or collections.
// ... const someData = [ ... ];
// ... await someColl.insertMany(someData);
// Create an empty pipeline array.
const pipeline = [];
// Add code to create pipeline stages.
// ... pipeline.push({ ... })
// Run the aggregation.
// ... const aggregationResult = ...
// Print the aggregation results.
for await (const document of aggregationResult) {
console.log(document);
}
} finally {
await client.close();
}
}
run().catch(console.dir);

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión de la guía de inicio rápido de Nodo.js.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

const uri = "mongodb+srv://mongodb-example:27017";

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

const orders = aggDB.collection("orders");
await orders.deleteMany({});
await orders.insertMany([
{
order_id: 6363763262239,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 431,
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 22,
},
],
},
{
order_id: 1197372932325,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 429,
},
],
},
{
order_id: 9812343774839,
products: [
{
prod_id: "pqr88223",
name: "Morphy Richards Food Mixer",
price: 431,
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 21,
},
],
},
{
order_id: 4433997244387,
products: [
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 23,
},
{
prod_id: "jkl77336",
name: "Picky Pencil Sharpener",
price: 1,
},
{
prod_id: "xyz11228",
name: "Russell Hobbs Chrome Kettle",
price: 16,
},
],
},
]);

Antes de comenzar a seguir este tutorial de agregación, debes configurar una nueva aplicación PHP. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar la biblioteca PHP y conectarte a MongoDB, consulta el tutorial Comenzar a usar la librería PHP.

Para obtener más información sobre cómo realizar agregaciones en la biblioteca de PHP, consulta la Guía de agregación.

Después de instalar la biblioteca, crea un archivo llamado agg_tutorial.php. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

<?php
require 'vendor/autoload.php';
// Modify imports for each tutorial as needed.
use MongoDB\Client;
use MongoDB\BSON\UTCDateTime;
use MongoDB\Builder\Pipeline;
use MongoDB\Builder\Stage;
use MongoDB\Builder\Type\Sort;
use MongoDB\Builder\Query;
use MongoDB\Builder\Expression;
use MongoDB\Builder\Accumulator;
use function MongoDB\object;
// Replace the placeholder with your connection string.
$uri = '<connection string>';
$client = new Client($uri);
// Get a reference to relevant collections.
// ... $someColl = $client->agg_tutorials_db->someColl;
// ... $anotherColl = $client->agg_tutorials_db->anotherColl;
// Delete any existing documents in collections if needed.
// ... $someColl->deleteMany([]);
// Insert sample data into the collection or collections.
// ... $someColl->insertMany(...);
// Add code to create pipeline stages within the Pipeline instance.
// ... $pipeline = new Pipeline(...);
// Run the aggregation.
// ... $cursor = $someColl->aggregate($pipeline);
// Print the aggregation results.
foreach ($cursor as $doc) {
echo json_encode($doc, JSON_PRETTY_PRINT), PHP_EOL;
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión del tutorial Comenzar con la librería PHP.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

$uri = 'mongodb+srv://mongodb-example:27017';

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

$orders = $client->agg_tutorials_db->orders;
$orders->deleteMany([]);
$orders->insertMany(
[
[
'order_id' => 6363763262239,
'products' => [
[
'prod_id' => 'abc12345',
'name' => 'Asus Laptop',
'price' => 431,
],
[
'prod_id' => 'def45678',
'name' => 'Karcher Hose Set',
'price' => 22,
],
],
],
[
'order_id' => 1197372932325,
'products' => [
[
'prod_id' => 'abc12345',
'name' => 'Asus Laptop',
'price' => 429,
],
],
],
[
'order_id' => 9812343774839,
'products' => [
[
'prod_id' => 'pqr88223',
'name' => 'Morphy Richards Food Mixer',
'price' => 431,
],
[
'prod_id' => 'def45678',
'name' => 'Karcher Hose Set',
'price' => 21,
],
],
],
[
'order_id' => 4433997244387,
'products' => [
[
'prod_id' => 'def45678',
'name' => 'Karcher Hose Set',
'price' => 23,
],
[
'prod_id' => 'jkl77336',
'name' => 'Picky Pencil Sharpener',
'price' => 1,
],
[
'prod_id' => 'xyz11228',
'name' => 'Russell Hobbs Chrome Kettle',
'price' => 16,
],
],
]
]
);

Antes de comenzar a seguir este tutorial de agregación, debe configurar una nueva aplicación de Python. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender a instalar PyMongo y conectarte a MongoDB, consulta el tutorial Get Started with PyMongo.

Para obtener más información sobre cómo realizar agregaciones en PyMongo, consulta la Guía de agregación.

Después de instalar la biblioteca, crea un archivo llamado agg_tutorial.py. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

# Modify imports for each tutorial as needed.
from pymongo import MongoClient
# Replace the placeholder with your connection string.
uri = "<connection string>"
client = MongoClient(uri)
try:
agg_db = client["agg_tutorials_db"]
# Get a reference to relevant collections.
# ... some_coll = agg_db["some_coll"]
# ... another_coll = agg_db["another_coll"]
# Delete any existing documents in collections if needed.
# ... some_coll.delete_many({})
# Insert sample data into the collection or collections.
# ... some_coll.insert_many(...)
# Create an empty pipeline array.
pipeline = []
# Add code to create pipeline stages.
# ... pipeline.append({...})
# Run the aggregation.
# ... aggregation_result = ...
# Print the aggregation results.
for document in aggregation_result:
print(document)
finally:
client.close()

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión del tutorial Comenzar con la librería PHP.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

uri = "mongodb+srv://mongodb-example:27017"

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

orders_coll = agg_db["orders"]
orders_coll.delete_many({})
order_data = [
{
"order_id": 6363763262239,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 22,
},
],
},
{
"order_id": 1197372932325,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 429,
}
],
},
{
"order_id": 9812343774839,
"products": [
{
"prod_id": "pqr88223",
"name": "Morphy Richards Food Mixer",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 21,
},
],
},
{
"order_id": 4433997244387,
"products": [
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 23,
},
{
"prod_id": "jkl77336",
"name": "Picky Pencil Sharpener",
"price": 1,
},
{
"prod_id": "xyz11228",
"name": "Russell Hobbs Chrome Kettle",
"price": 16,
},
],
},
]
orders_coll.insert_many(order_data)

Antes de comenzar a seguir este tutorial de agregación, debes configurar una nueva aplicación de Ruby. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador de Ruby y conectarte a MongoDB, consulta la Guía de introducción al controlador de Ruby.

Para obtener más información sobre cómo realizar agregaciones en el controlador Ruby, consulta la Guía de agregación.

Después de instalar el controlador, crea un archivo llamado agg_tutorial.rb. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

# typed: strict
require 'mongo'
require 'bson'
# Replace the placeholder with your connection string.
uri = "<connection string>"
Mongo::Client.new(uri) do |client|
agg_db = client.use('agg_tutorials_db')
# Get a reference to relevant collections.
# ... some_coll = agg_db[:some_coll]
# Delete any existing documents in collections if needed.
# ... some_coll.delete_many({})
# Insert sample data into the collection or collections.
# ... some_coll.insert_many( ... )
# Add code to create pipeline stages within the array.
# ... pipeline = [ ... ]
# Run the aggregation.
# ... aggregation_result = some_coll.aggregate(pipeline)
# Print the aggregation results.
aggregation_result.each do |doc|
puts doc
end
end

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión de la guía de inicio de Ruby.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

uri = "mongodb+srv://mongodb-example:27017"

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

orders = agg_db[:orders]
orders.delete_many({})
orders.insert_many(
[
{
order_id: 6363763262239,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 431,
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 22,
},
],
},
{
order_id: 1197372932325,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 429,
},
],
},
{
order_id: 9812343774839,
products: [
{
prod_id: "pqr88223",
name: "Morphy Richards Food Mixer",
price: 431,
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 21,
},
],
},
{
order_id: 4433997244387,
products: [
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 23,
},
{
prod_id: "jkl77336",
name: "Picky Pencil Sharpener",
price: 1,
},
{
prod_id: "xyz11228",
name: "Russell Hobbs Chrome Kettle",
price: 16,
},
],
},
]
)

Antes de comenzar a seguir este tutorial de agregación, debes configurar una nueva aplicación de Rust. Puedes usar esta aplicación para conectarte a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar el pipeline de agregación.

Tip

Para aprender cómo instalar el controlador y conectarte a MongoDB, consulta la Guía de inicio rápido del controlador de Rust.

Para obtener más información sobre cómo realizar agregaciones en el controlador de Rust, consulta la Guía de agregación.

Después de instalar el controlador, crea un archivo llamado agg-tutorial.rs. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

use mongodb::{
bson::{doc, Document},
options::ClientOptions,
Client,
};
use futures::stream::TryStreamExt;
use std::error::Error;
// Define structs.
// #[derive(Debug, Serialize, Deserialize)]
// struct MyStruct { ... }
#[tokio::main]
async fn main() mongodb::error::Result<()> {
// Replace the placeholder with your connection string.
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
let agg_db = client.database("agg_tutorials_db");
// Get a reference to relevant collections.
// ... let some_coll: Collection<T> = agg_db.collection("...");
// ... let another_coll: Collection<T> = agg_db.collection("...");
// Delete any existing documents in collections if needed.
// ... some_coll.delete_many(doc! {}).await?;
// Insert sample data into the collection or collections.
// ... some_coll.insert_many(vec![...]).await?;
// Create an empty pipeline.
let mut pipeline = Vec::new();
// Add code to create pipeline stages.
// pipeline.push(doc! { ... });
// Run the aggregation and print the results.
let mut results = some_coll.aggregate(pipeline).await?;
while let Some(result) = results.try_next().await? {
println!("{:?}\n", result);
}
Ok(())
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de su implementación, consulte el paso Crear una cadena de conexión de la guía de inicio rápido de Rust.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

let uri = "mongodb+srv://mongodb-example:27017";

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Primero, crea estructuras de Rust para modelar los datos en la colección orders:

#[derive(Debug, Serialize, Deserialize)]
struct Product {
prod_id: String,
name: String,
price: i32,
}
#[derive(Debug, Serialize, Deserialize)]
struct Order {
order_id: i64,
products: Vec<Product>,
}

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

let orders_coll: Collection<Order> = agg_db.collection("orders");
orders.delete_many(doc! {}).await?;
let orders = vec![
Order {
order_id: 6363763262239,
products: vec![
Product {
prod_id: "abc12345".to_string(),
name: "Asus Laptop".to_string(),
price: 431,
},
Product {
prod_id: "def45678".to_string(),
name: "Karcher Hose Set".to_string(),
price: 22,
},
],
},
Order {
order_id: 1197372932325,
products: vec![Product {
prod_id: "abc12345".to_string(),
name: "Asus Laptop".to_string(),
price: 429,
}],
},
Order {
order_id: 9812343774839,
products: vec![
Product {
prod_id: "pqr88223".to_string(),
name: "Morphy Richards Food Mixer".to_string(),
price: 431,
},
Product {
prod_id: "def45678".to_string(),
name: "Karcher Hose Set".to_string(),
price: 21,
},
],
},
Order {
order_id: 4433997244387,
products: vec![
Product {
prod_id: "def45678".to_string(),
name: "Karcher Hose Set".to_string(),
price: 23,
},
Product {
prod_id: "jkl77336".to_string(),
name: "Picky Pencil Sharpene".to_string(),
price: 1,
},
Product {
prod_id: "xyz11228".to_string(),
name: "Russell Hobbs Chrome Kettle".to_string(),
price: 16,
},
],
},
];
orders_coll.insert_many(orders).await?;

Antes de comenzar a seguir un tutorial de agregación, debe configurar una nueva aplicación de Scala. Puede usar esta aplicación para conectarse a una implementación de MongoDB, insertar datos de muestra en MongoDB y ejecutar la canalización de agregación.

Tip

Para aprender cómo instalar el controlador y conectarte a MongoDB, consulta la Guía para comenzar con el controlador de Scala.

Para obtener más información sobre cómo realizar agregaciones en el Scala Driver, consulta la Guía de agregación.

Después de instalar el controlador, crea un archivo llamado AggTutorial.scala. Pega el siguiente código en este archivo para crear una plantilla de aplicación para los tutoriales de agregación.

Importante

En el siguiente código, lee los comentarios del código para encontrar las secciones del código que debes modificar para el tutorial que estás siguiendo.

Si intenta ejecutar el código sin hacer ningún cambio, se encontrará con un error de conexión.

package org.example;
// Modify imports for each tutorial as needed.
import org.mongodb.scala.MongoClient
import org.mongodb.scala.bson.Document
import org.mongodb.scala.model.{Accumulators, Aggregates, Field, Filters, Variable}
import java.text.SimpleDateFormat
object FilteredSubset {
def main(args: Array[String]): Unit = {
// Replace the placeholder with your connection string.
val uri = "<connection string>"
val mongoClient = MongoClient(uri)
Thread.sleep(1000)
val aggDB = mongoClient.getDatabase("agg_tutorials_db")
// Get a reference to relevant collections.
// ... val someColl = aggDB.getCollection("someColl")
// ... val anotherColl = aggDB.getCollection("anotherColl")
// Delete any existing documents in collections if needed.
// ... someColl.deleteMany(Filters.empty()).subscribe(...)
// If needed, create the date format template.
val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
// Insert sample data into the collection or collections.
// ... someColl.insertMany(...).subscribe(...)
Thread.sleep(1000)
// Add code to create pipeline stages within the Seq.
// ... val pipeline = Seq(...)
// Run the aggregation and print the results.
// ... someColl.aggregate(pipeline).subscribe(...)
Thread.sleep(1000)
mongoClient.close()
}
}

Para cada tutorial, se debe reemplazar el marcador de posición de la cadena de conexión con la cadena de conexión de la implementación.

Tip

Para aprender a localizar la cadena de conexión de la implementación, se debe consultar el paso Crear una cadena de conexión de la guía de inicio del driver de Scala.

Por ejemplo, si la cadena de conexión es "mongodb+srv://mongodb-example:27017", la asignación de cadena de conexión se asemeja a lo siguiente:

val uri = "mongodb+srv://mongodb-example:27017"

Este ejemplo utiliza una colección orders, que contiene documentos que describen órdenes de productos. Debido a que cada pedido contiene múltiples productos, el primer paso de la agregación descompone el arreglo de productos en documentos individuales de pedido de producto.

Para crear la colección orders e insertar los datos de muestra, se debe añadir el siguiente código a la aplicación:

val orders = aggDB.getCollection("orders")
orders.deleteMany(Filters.empty()).subscribe(
_ => {},
e => println("Error: " + e.getMessage),
)
orders.insertMany(Seq(
Document(
"order_id" -> 6363763262239L,
"products" -> Seq(
Document(
"prod_id" -> "abc12345",
"name" -> "Asus Laptop",
"price" -> 431
),
Document(
"prod_id" -> "def45678",
"name" -> "Karcher Hose Set",
"price" -> 22
)
)
),
Document(
"order_id" -> 1197372932325L,
"products" -> Seq(
Document(
"prod_id" -> "abc12345",
"name" -> "Asus Laptop",
"price" -> 429
)
)
),
Document(
"order_id" -> 9812343774839L,
"products" -> Seq(
Document(
"prod_id" -> "pqr88223",
"name" -> "Morphy Richards Food Mixer",
"price" -> 431
),
Document(
"prod_id" -> "def45678",
"name" -> "Karcher Hose Set",
"price" -> 21
)
)
),
Document(
"order_id" -> 4433997244387L,
"products" -> Seq(
Document(
"prod_id" -> "def45678",
"name" -> "Karcher Hose Set",
"price" -> 23
),
Document(
"prod_id" -> "jkl77336",
"name" -> "Picky Pencil Sharpener",
"price" -> 1
),
Document(
"prod_id" -> "xyz11228",
"name" -> "Russell Hobbs Chrome Kettle",
"price" -> 16
)
)
)
)).subscribe(
_ => {},
e => println("Error: " + e.getMessage),
)

Los siguientes pasos muestran cómo crear y ejecutar un pipeline de agregación para descomponer los campos de los arreglos en documentos separados y calcular nuevos valores basados en grupos de valores comunes.

1
db.orders.aggregate( [
// Stage 1: Unwind the array of product orders
{ $unwind: { path: "$products" } },
// Stage 2: Match products that cost more than $15
{ $match: { "products.price": { $gt: 15 } } },
// Stage 3: Group products by product type
{ $group:
{
_id: "$products.prod_id",
product: { $first: "$products.name" },
total_value: { $sum: "$products.price" },
quantity: { $sum: 1 }
}
},
// Stage 4: Display the product ID
{ $set: { product_id: "$_id" } },
// Stage 5: Remove unneeded fields
{ $unset: [ "_id"] }
] )
2

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{
product: 'Asus Laptop',
total_value: 860,
quantity: 2,
product_id: 'abc12345'
}
{
product: 'Morphy Richards Food Mixer',
total_value: 431,
quantity: 1,
product_id: 'pqr88223'
}
{
product: 'Russell Hobbs Chrome Kettle',
total_value: 16,
quantity: 1,
product_id: 'xyz11228'
}
{
product: 'Karcher Hose Set',
total_value: 66,
quantity: 3,
product_id: 'def45678'
}

Nota

Al ejecutar este ejemplo, el orden de los documentos en los resultados puede diferir del orden de los documentos en esta página, ya que el pipeline de agregación no contiene una etapa de ordenamiento.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

"{", "$unwind", "{", "path", BCON_UTF8("$products"), "}", "}",
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

"{", "$match", "{", "products.price", "{", "$gt", BCON_INT32(15), "}", "}", "}",
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

"{", "$group", "{",
"_id", BCON_UTF8("$products.prod_id"),
"product", "{", "$first", BCON_UTF8("$products.name"), "}",
"total_value", "{", "$sum", BCON_UTF8("$products.price"), "}",
"quantity", "{", "$sum", BCON_INT32(1), "}",
"}", "}",
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

"{", "$set", "{", "product_id", BCON_UTF8("$_id"), "}", "}",
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

"{", "$unset", "[", BCON_UTF8("_id"), "]", "}",
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

mongoc_cursor_t *results =
mongoc_collection_aggregate(orders, MONGOC_QUERY_NONE, pipeline, NULL, NULL);
bson_destroy(pipeline);

Asegúrese de limpiar los recursos de la colección añadiendo la siguiente línea a sus instrucciones de limpieza:

mongoc_collection_destroy(orders);

Finalmente, se deben ejecutar los siguientes comandos en el shell para generar y ejecutar el ejecutable:

gcc -o aggc agg-tutorial.c $(pkg-config --libs --cflags libmongoc-1.0)
./aggc

Tip

Si encuentras errores de conexión al ejecutar los comandos anteriores en una sola llamada, puedes ejecutarlos por separado.

7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{ "product" : "Asus Laptop", "total_value" : { "$numberInt" : "860" }, "quantity" : { "$numberInt" : "2" }, "product_id" : "abc12345" }
{ "product" : "Karcher Hose Set", "total_value" : { "$numberInt" : "66" }, "quantity" : { "$numberInt" : "3" }, "product_id" : "def45678" }
{ "product" : "Morphy Richards Food Mixer", "total_value" : { "$numberInt" : "431" }, "quantity" : { "$numberInt" : "1" }, "product_id" : "pqr88223" }
{ "product" : "Russell Hobbs Chrome Kettle", "total_value" : { "$numberInt" : "16" }, "quantity" : { "$numberInt" : "1" }, "product_id" : "xyz11228" }

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

pipeline.unwind("$products");
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

pipeline.match(bsoncxx::from_json(R"({
"products.price": { "$gt": 15 }
})"));
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

pipeline.group(bsoncxx::from_json(R"({
"_id": "$products.prod_id",
"product": { "$first": "$products.name" },
"total_value": { "$sum": "$products.price" },
"quantity": { "$sum": 1 }
})"));
4

Agregar una etapa $addFields para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

pipeline.add_fields(bsoncxx::from_json(R"({
"product_id": "$_id"
})"));
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

pipeline.append_stage(bsoncxx::from_json(R"({
"$unset": ["_id"]
})"));
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

auto cursor = orders.aggregate(pipeline);

Finalmente, ejecute el siguiente comando en su shell para iniciar su aplicación:

c++ --std=c++17 agg-tutorial.cpp $(pkg-config --cflags --libs libmongocxx) -o ./app.out
./app.out
7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{ "product" : "Karcher Hose Set", "total_value" : 66, "quantity" : 3, "product_id" : "def45678" }
{ "product" : "Asus Laptop", "total_value" : 860, "quantity" : 2, "product_id" : "abc12345" }
{ "product" : "Morphy Richards Food Mixer", "total_value" : 431, "quantity" : 1, "product_id" : "pqr88223" }
{ "product" : "Russell Hobbs Chrome Kettle", "total_value" : 16, "quantity" : 1, "product_id" : "xyz11228" }

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se inicia la agregación en la colección orders y encadena una etapa $unwind para separar las entradas del arreglo Products en documentos individuales:

var results = orders.Aggregate()
.Unwind<Order, OrderUnwound>(o => o.Products)
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor Products.Price mayor que 15:

.Match(o => o.Products.Price > 15)
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo ProductId. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • ProductId: el ID del producto (la clave de agrupación)

  • Product: el nombre del producto

  • TotalValue: el valor total de todas las ventas del producto

  • Quantity: el número de pedidos del producto

.Group(
id: o => o.Products.ProductId,
group: g => new
{
ProductId = g.Key,
Product = g.First().Products.Name,
TotalValue = g.Sum(o => o.Products.Price),
Quantity = g.Count(),
}
);
4

Por último, se debe ejecutar la aplicación en el IDE e inspeccionar los resultados.

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{ ProductId = pqr88223, Product = Morphy Richards Food Mixer, TotalValue = 431, Quantity = 1 }
{ ProductId = xyz11228, Product = Russell Hobbs Chrome Kettle, TotalValue = 16, Quantity = 1 }
{ ProductId = abc12345, Product = Asus Laptop, TotalValue = 860, Quantity = 2 }
{ ProductId = def45678, Product = Karcher Hose Set, TotalValue = 66, Quantity = 3 }

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

unwindStage := bson.D{{Key: "$unwind", Value: bson.D{
{Key: "path", Value: "$products"},
}}}
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

matchStage := bson.D{{Key: "$match", Value: bson.D{
{Key: "products.price", Value: bson.D{{Key: "$gt", Value: 15}}},
}}}
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

groupStage := bson.D{{Key: "$group", Value: bson.D{
{Key: "_id", Value: "$products.prod_id"},
{Key: "product", Value: bson.D{{Key: "$first", Value: "$products.name"}}},
{Key: "total_value", Value: bson.D{{Key: "$sum", Value: "$products.price"}}},
{Key: "quantity", Value: bson.D{{Key: "$sum", Value: 1}}},
}}}
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

setStage := bson.D{{Key: "$set", Value: bson.D{
{Key: "product_id", Value: "$_id"},
}}}
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

unsetStage := bson.D{{Key: "$unset", Value: bson.A{"_id"}}}
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

pipeline := mongo.Pipeline{unwindStage, matchStage, groupStage, setStage, unsetStage}
cursor, err := orders.Aggregate(context.TODO(), pipeline)

Finalmente, ejecute el siguiente comando en su shell para iniciar su aplicación:

go run agg_tutorial.go
7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{"product":"Morphy Richards Food Mixer","total_value":431,"quantity":1,"product_id":"pqr88223"}
{"product":"Russell Hobbs Chrome Kettle","total_value":16,"quantity":1,"product_id":"xyz11228"}
{"product":"Karcher Hose Set","total_value":66,"quantity":3,"product_id":"def45678"}
{"product":"Asus Laptop","total_value":860,"quantity":2,"product_id":"abc12345"}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

pipeline.add(Aggregates.unwind("$products"));
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

pipeline.add(Aggregates.match(
Filters.gt("products.price", 15)
));
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

pipeline.add(Aggregates.group(
"$products.prod_id",
Accumulators.first("product", "$products.name"),
Accumulators.sum("total_value", "$products.price"),
Accumulators.sum("quantity", 1)
));
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

pipeline.add(Aggregates.set(new Field<>("product_id", "$_id")));
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

pipeline.add(Aggregates.unset("_id"));
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

AggregateIterable<Document> aggregationResult = orders.aggregate(pipeline);

Finalmente, ejecute la aplicación en su IDE.

7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{"product": "Asus Laptop", "total_value": 860, "quantity": 2, "product_id": "abc12345"}
{"product": "Russell Hobbs Chrome Kettle", "total_value": 16, "quantity": 1, "product_id": "xyz11228"}
{"product": "Karcher Hose Set", "total_value": 66, "quantity": 3, "product_id": "def45678"}
{"product": "Morphy Richards Food Mixer", "total_value": 431, "quantity": 1, "product_id": "pqr88223"}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

pipeline.add(
Aggregates.unwind("\$${Order::products.name}")
)
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

pipeline.add(
Aggregates.match(
Filters.gt("${Order::products.name}.${Product::price.name}", 15)
)
)
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prodID. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

pipeline.add(
Aggregates.group(
"\$${Order::products.name}.${Product::prodID.name}",
Accumulators.first("product", "\$${Order::products.name}.${Product::name.name}"),
Accumulators.sum("total_value", "\$${Order::products.name}.${Product::price.name}"),
Accumulators.sum("quantity", 1)
)
)
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

pipeline.add(Aggregates.set(Field("product_id", "\$_id")))
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

pipeline.add(Aggregates.unset("_id"))
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

val aggregationResult = orders.aggregate<Document>(pipeline)

Finalmente, ejecute la aplicación en su IDE.

7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

Document{{product=Russell Hobbs Chrome Kettle, total_value=16, quantity=1, product_id=xyz11228}}
Document{{product=Karcher Hose Set, total_value=66, quantity=3, product_id=def45678}}
Document{{product=Morphy Richards Food Mixer, total_value=431, quantity=1, product_id=pqr88223}}
Document{{product=Asus Laptop, total_value=860, quantity=2, product_id=abc12345}}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

pipeline.push({
$unwind: {
path: "$products",
},
});
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

pipeline.push({
$match: {
"products.price": {
$gt: 15,
},
},
});
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

pipeline.push({
$group: {
_id: "$products.prod_id",
product: { $first: "$products.name" },
total_value: { $sum: "$products.price" },
quantity: { $sum: 1 },
},
});
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

pipeline.push({
$set: {
product_id: "$_id",
},
});
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

pipeline.push({ $unset: ["_id"] });
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

const aggregationResult = await orders.aggregate(pipeline);

Finalmente, ejecute el siguiente comando en su shell para iniciar su aplicación:

node agg_tutorial.js
7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{
product: 'Asus Laptop',
total_value: 860,
quantity: 2,
product_id: 'abc12345'
}
{
product: 'Morphy Richards Food Mixer',
total_value: 431,
quantity: 1,
product_id: 'pqr88223'
}
{
product: 'Russell Hobbs Chrome Kettle',
total_value: 16,
quantity: 1,
product_id: 'xyz11228'
}
{
product: 'Karcher Hose Set',
total_value: 66,
quantity: 3,
product_id: 'def45678'
}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

Stage::unwind(
path: Expression::arrayFieldPath('products')
),
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

Stage::match(
['products.price' => Query::gt(15)]
),
3

Fuera de la instancia Pipeline, crear una etapa $group en una función de fábrica para recopilar documentos de pedido según el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

function groupByProductStage()
{
return Stage::group(
_id: Expression::stringFieldPath('products.prod_id'),
product: Accumulator::first(
Expression::stringFieldPath('products.name')
),
total_value: Accumulator::sum(
Expression::numberFieldPath('products.price'),
),
quantity: Accumulator::sum(1)
);
}

Luego, en la instancia de Pipeline, llamar a la función groupByProductStage():

groupByProductStage(),
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

Stage::set(product_id: Expression::stringFieldPath('_id')),
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

Stage::unset('_id')
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

$cursor = $orders->aggregate($pipeline);

Finalmente, ejecute el siguiente comando en su shell para iniciar su aplicación:

php agg_tutorial.php
7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{
"product": "Russell Hobbs Chrome Kettle",
"total_value": 16,
"quantity": 1,
"product_id": "xyz11228"
}
{
"product": "Asus Laptop",
"total_value": 860,
"quantity": 2,
"product_id": "abc12345"
}
{
"product": "Karcher Hose Set",
"total_value": 66,
"quantity": 3,
"product_id": "def45678"
}
{
"product": "Morphy Richards Food Mixer",
"total_value": 431,
"quantity": 1,
"product_id": "pqr88223"
}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

pipeline.append({"$unwind": {"path": "$products"}})
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

pipeline.append({"$match": {"products.price": {"$gt": 15}}})
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

pipeline.append(
{
"$group": {
"_id": "$products.prod_id",
"product": {"$first": "$products.name"},
"total_value": {"$sum": "$products.price"},
"quantity": {"$sum": 1},
}
}
)
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

pipeline.append({"$set": {"product_id": "$_id"}})
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

pipeline.append({"$unset": ["_id"]})
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

aggregation_result = orders_coll.aggregate(pipeline)

Finalmente, ejecute el siguiente comando en su shell para iniciar su aplicación:

python3 agg_tutorial.py
7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{'product': 'Morphy Richards Food Mixer', 'total_value': 431, 'quantity': 1, 'product_id': 'pqr88223'}
{'product': 'Asus Laptop', 'total_value': 860, 'quantity': 2, 'product_id': 'abc12345'}
{'product': 'Russell Hobbs Chrome Kettle', 'total_value': 16, 'quantity': 1, 'product_id': 'xyz11228'}
{'product': 'Karcher Hose Set', 'total_value': 66, 'quantity': 3, 'product_id': 'def45678'}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

{
"$unwind": {
path: "$products",
},
},
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

{
"$match": {
"products.price": {
"$gt": 15,
},
},
},
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

{
"$group": {
_id: "$products.prod_id",
product: { "$first": "$products.name" },
total_value: { "$sum": "$products.price" },
quantity: { "$sum": 1 },
},
},
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

{
"$set": {
product_id: "$_id",
},
},
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

{ "$unset": ["_id"] },
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

aggregation_result = orders.aggregate(pipeline)

Finalmente, ejecute el siguiente comando en su shell para iniciar su aplicación:

ruby agg_tutorial.rb
7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{"product"=>"Asus Laptop", "total_value"=>860, "quantity"=>2, "product_id"=>"abc12345"}
{"product"=>"Russell Hobbs Chrome Kettle", "total_value"=>16, "quantity"=>1, "product_id"=>"xyz11228"}
{"product"=>"Karcher Hose Set", "total_value"=>66, "quantity"=>3, "product_id"=>"def45678"}
{"product"=>"Morphy Richards Food Mixer", "total_value"=>431, "quantity"=>1, "product_id"=>"pqr88223"}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

pipeline.push(doc! {
"$unwind": {
"path": "$products"
}
});
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

pipeline.push(doc! {
"$match": {
"products.price": { "$gt": 15 }
}
});
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

pipeline.push(doc! {
"$group": {
"_id": "$products.prod_id",
"product": { "$first": "$products.name" },
"total_value": { "$sum": "$products.price" },
"quantity": { "$sum": 1 }
}
});
4

Añadir una etapa $set para recrear el campo prod_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

pipeline.push(doc! {
"$set": {
"prod_id": "$_id"
}
});
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

pipeline.push(doc! {
"$unset": ["_id"]
});
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

let mut cursor = orders_coll.aggregate(pipeline).await?;

Finalmente, ejecute el siguiente comando en su shell para iniciar su aplicación:

cargo run
7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

Document({"product": String("Russell Hobbs Chrome Kettle"), "total_value": Int32(16), "quantity": Int32(1),
"prod_id": String("xyz11228")})
Document({"product": String("Morphy Richards Food Mixer"), "total_value": Int32(431), "quantity": Int32(1),
"prod_id": String("pqr88223")})
Document({"product": String("Karcher Hose Set"), "total_value": Int32(66), "quantity": Int32(3),
"prod_id": String("def45678")})
Document({"product": String("Asus Laptop"), "total_value": Int32(860), "quantity": Int32(2),
"prod_id": String("abc12345")})

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

1

Primero, se agrega una etapa $unwind para separar las entradas del arreglo products en documentos individuales:

Aggregates.unwind("$products"),
2

Después, se debe agregar una etapa $match que haga coincidir productos con un valor products.price mayor que 15:

Aggregates.filter(Filters.gt("products.price", 15)),
3

Añadir una etapa $group para recopilar documentos de pedido por el valor del campo prod_id. En esta etapa, añadir operaciones de agregación que creen los siguientes campos en los documentos resultantes:

  • product: el nombre del producto

  • total_value: el valor total de todas las ventas del producto

  • quantity: el número de pedidos del producto

Aggregates.group(
"$products.prod_id",
Accumulators.first("product", "$products.name"),
Accumulators.sum("total_value", "$products.price"),
Accumulators.sum("quantity", 1)
),
4

Añadir una etapa $set para recrear el campo product_id a partir de los valores en el campo _id que se establecieron durante la etapa $group:

Aggregates.set(Field("product_id", "$_id")),
5

Por último, añadir una etapa $unset. La etapa $unset remueve el campo _id de los documentos de resultado:

Aggregates.unset("_id")
6

Se debe agregar el siguiente código al final de la aplicación para realizar la agregación en la colección orders:

orders.aggregate(pipeline)
.subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"Error: $e"))

Finalmente, ejecute la aplicación en su IDE.

7

La agregación devuelve el siguiente resumen de los pedidos de los clientes de 2020:

{"product": "Morphy Richards Food Mixer", "total_value": 431, "quantity": 1, "product_id": "pqr88223"}
{"product": "Karcher Hose Set", "total_value": 66, "quantity": 3, "product_id": "def45678"}
{"product": "Russell Hobbs Chrome Kettle", "total_value": 16, "quantity": 1, "product_id": "xyz11228"}
{"product": "Asus Laptop", "total_value": 860, "quantity": 2, "product_id": "abc12345"}

Los documentos de resultados contienen detalles sobre el valor total y la cantidad de pedidos de productos que cuestan más de 15 dólares.

Volver

Grupo y Totales

En esta página