Este tutorial ilustra como construir um pipeline de agregação , executar a agregação em uma coleção e exibir os resultados usando a linguagem de sua escolha.
Sobre esta tarefa
Este tutorial demonstra como agrupar e analisar dados de pedido de cliente . Os resultados mostram a lista de clientes que compraram itens em 2020 e incluem o histórico de pedidos de cada cliente para 2020.
O agregação pipeline executa as seguintes operações:
Corresponde a um subconjunto de documentos pelo valor de um campo
Agrupa documentos por valores de campo comuns
Adiciona campos computados a cada documento de resultado
Antes de começar
➤ Use o menu suspenso Selecione seu idioma no canto superior direito para definir o idioma dos exemplos a seguir ou selecione o shell do MongoDB.
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
, use o método insertMany()
:
db.orders.insertMany( [ { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-05-30T08:35:52Z"), value: 231, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-01-13T09:32:07Z"), value: 99, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), value: 63, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), value: 2, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2020-11-23T22:56:53Z"), value: 187, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2020-08-18T23:04:48Z"), value: 4, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-12-26T08:55:46Z"), value: 4, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2021-02-29T07:49:32Z"), value: 1024, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-10-03T13:49:44Z"), value: 102, } ] )
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo C. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Introdução ao driver C.
Para saber mais sobre como realizar agregações no C Driver, consulte o Guia de agregação.
Depois de instalar o driver, crie um arquivo chamado agg-tutorial.c
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma cadeia de conexão do guia de Introdução C.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
char *uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
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 = 9; bson_t *docs[num_docs]; docs[0] = BCON_NEW( "customer_id", BCON_UTF8("elise_smith@myemail.com"), "orderdate", BCON_DATE_TIME(1590825352000UL), // 2020-05-30T08:35:52Z "value", BCON_INT32(231)); docs[1] = BCON_NEW( "customer_id", BCON_UTF8("elise_smith@myemail.com"), "orderdate", BCON_DATE_TIME(1578904327000UL), // 2020-01-13T09:32:07Z "value", BCON_INT32(99)); docs[2] = BCON_NEW( "customer_id", BCON_UTF8("oranieri@warmmail.com"), "orderdate", BCON_DATE_TIME(1577865937000UL), // 2020-01-01T08:25:37Z "value", BCON_INT32(63)); docs[3] = BCON_NEW( "customer_id", BCON_UTF8("tj@wheresmyemail.com"), "orderdate", BCON_DATE_TIME(1559061212000UL), // 2019-05-28T19:13:32Z "value", BCON_INT32(2)); docs[4] = BCON_NEW( "customer_id", BCON_UTF8("tj@wheresmyemail.com"), "orderdate", BCON_DATE_TIME(1606171013000UL), // 2020-11-23T22:56:53Z "value", BCON_INT32(187)); docs[5] = BCON_NEW( "customer_id", BCON_UTF8("tj@wheresmyemail.com"), "orderdate", BCON_DATE_TIME(1597793088000UL), // 2020-08-18T23:04:48Z "value", BCON_INT32(4)); docs[6] = BCON_NEW( "customer_id", BCON_UTF8("elise_smith@myemail.com"), "orderdate", BCON_DATE_TIME(1608963346000UL), // 2020-12-26T08:55:46Z "value", BCON_INT32(4)); docs[7] = BCON_NEW( "customer_id", BCON_UTF8("tj@wheresmyemail.com"), "orderdate", BCON_DATE_TIME(1614496172000UL), // 2021-02-28T07:49:32Z "value", BCON_INT32(1024)); docs[8] = BCON_NEW( "customer_id", BCON_UTF8("elise_smith@myemail.com"), "orderdate", BCON_DATE_TIME(1601722184000UL), // 2020-10-03T13:49:44Z "value", BCON_INT32(102)); 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]); } }
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo C++ . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o tutorial Introdução ao C++.
Para saber mais sobre como usar o driver C++, consulte a documentação da API.
Para saber mais sobre como executar agregações no driver C++ , consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg-tutorial.cpp
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma cadeia de conexão do tutorial de Introdução do C++.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
mongocxx::uri uri{"mongodb+srv://mongodb-example:27017"};
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
auto orders = db["orders"]; std::vector<bsoncxx::document::value> docs = { bsoncxx::from_json(R"({ "customer_id": "elise_smith@myemail.com", "orderdate": {"$date": 1590821752000}, "value": 231 })"), bsoncxx::from_json(R"({ "customer_id": "elise_smith@myemail.com", "orderdate": {"$date": 1578901927}, "value": 99 })"), bsoncxx::from_json(R"({ "customer_id": "oranieri@warmmail.com", "orderdate": {"$date": 1577861137}, "value": 63 })"), bsoncxx::from_json(R"({ "customer_id": "tj@wheresmyemail.com", "orderdate": {"$date": 1559076812}, "value": 2 })"), bsoncxx::from_json(R"({ "customer_id": "tj@wheresmyemail.com", "orderdate": {"$date": 1606172213}, "value": 187 })"), bsoncxx::from_json(R"({ "customer_id": "tj@wheresmyemail.com", "orderdate": {"$date": 1597794288}, "value": 4 })"), bsoncxx::from_json(R"({ "customer_id": "elise_smith@myemail.com", "orderdate": {"$date": 1608972946000}, "value": 4 })"), bsoncxx::from_json(R"({ "customer_id": "tj@wheresmyemail.com", "orderdate": {"$date": 1614570572}, "value": 1024 })"), bsoncxx::from_json(R"({ "customer_id": "elise_smith@myemail.com", "orderdate": {"$date": 1601722184000}, "value": 102 })") }; auto result = orders.insert_many(docs); // Might throw an exception
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo C#/ .NET . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia de início rápido do driver C#/ .NET.
Para saber mais sobre como executar agregações no driver C#/ .NET, consulte o guia Agregação.
Depois de instalar o driver, cole o seguinte código no seu arquivo Program.cs
para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Driver; // 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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Configurar um cluster de camada grátis no Atlas do guia de Início Rápido de C#.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
var uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo CustomerId
, que contém endereços de e-mail dos cliente .
Primeiro, crie uma classe C# para modelar os dados na collection orders
:
public class Order { [ ] public ObjectId Id { get; set; } public string CustomerId { get; set; } = ""; public DateTime OrderDate { get; set; } public int Value { get; set; } }
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
var orders = aggDB.GetCollection<Order>("orders"); orders.InsertMany(new List<Order> { new Order { CustomerId = "elise_smith@myemail.com", OrderDate = DateTime.Parse("2020-05-30T08:35:52Z"), Value = 231 }, new Order { CustomerId = "elise_smith@myemail.com", OrderDate = DateTime.Parse("2020-01-13T09:32:07Z"), Value = 99 }, new Order { CustomerId = "oranieri@warmmail.com", OrderDate = DateTime.Parse("2020-01-01T08:25:37Z"), Value = 63 }, new Order { CustomerId = "tj@wheresmyemail.com", OrderDate = DateTime.Parse("2019-05-28T19:13:32Z"), Value = 2 }, new Order { CustomerId = "tj@wheresmyemail.com", OrderDate = DateTime.Parse("2020-11-23T22:56:53Z"), Value = 187 }, new Order { CustomerId = "tj@wheresmyemail.com", OrderDate = DateTime.Parse("2020-08-18T23:04:48Z"), Value = 4 }, new Order { CustomerId = "elise_smith@myemail.com", OrderDate = DateTime.Parse("2020-12-26T08:55:46Z"), Value = 4 }, new Order { CustomerId = "tj@wheresmyemail.com", OrderDate = DateTime.Parse("2021-02-28T07:49:32Z"), Value = 1024 }, new Order { CustomerId = "elise_smith@myemail.com", OrderDate = DateTime.Parse("2020-10-03T13:49:44Z"), Value = 102 } });
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Go. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Início Rápido do Driver Go.
Para saber mais sobre como executar agregações no Go Driver, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg_tutorial.go
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
package main import ( "context" "fmt" "log" "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() { ctx := context.Background() // 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(ctx); 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(cxt, 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(ctx, pipeline) if err != nil { log.Fatal(err) } defer func() { if err := cursor.Close(ctx); err != nil { log.Fatalf("failed to close cursor: %v", err) } }() // Decode the aggregation results. var results []bson.D if err = cursor.All(ctx, &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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar um cluster MongoDB do guia Go Quick Start.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
const uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Primeiro, crie uma estrutura Go para modelar os dados na collection orders
:
type Order struct { CustomerID string `bson:"customer_id,omitempty"` OrderDate bson.DateTime `bson:"orderdate"` Value int `bson:"value"` }
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
orders := aggDB.Collection("orders") _, err = orders.InsertMany(ctx, []interface{}{ Order{ CustomerID: "elise_smith@myemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 5, 30, 8, 35, 53, 0, time.UTC)), Value: 231, }, Order{ CustomerID: "elise_smith@myemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 1, 13, 9, 32, 7, 0, time.UTC)), Value: 99, }, Order{ CustomerID: "oranieri@warmmail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 1, 01, 8, 25, 37, 0, time.UTC)), Value: 63, }, Order{ CustomerID: "tj@wheresmyemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2019, 5, 28, 19, 13, 32, 0, time.UTC)), Value: 2, }, Order{ CustomerID: "tj@wheresmyemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 11, 23, 22, 56, 53, 0, time.UTC)), Value: 187, }, Order{ CustomerID: "tj@wheresmyemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 8, 18, 23, 4, 48, 0, time.UTC)), Value: 4, }, Order{ CustomerID: "elise_smith@myemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 12, 26, 8, 55, 46, 0, time.UTC)), Value: 4, }, Order{ CustomerID: "tj@wheresmyemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2021, 2, 29, 7, 49, 32, 0, time.UTC)), Value: 1024, }, Order{ CustomerID: "elise_smith@myemail.com", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 10, 3, 13, 49, 44, 0, time.UTC)), Value: 102, }, }) if err != nil { log.Fatal(err) }
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo Java . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Introdução ao driver Java.
Para saber mais sobre como realizar agregações no Driver Java Sync, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado AggTutorial.java
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
package org.example; // Modify imports for each tutorial as needed. import com.mongodb.client.*; import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Field; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import com.mongodb.client.model.Variable; import org.bson.Document; import org.bson.conversions.Bson; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; 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 = ... // 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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia Início Rápido do Java Sync.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
String uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
MongoDatabase aggDB = mongoClient.getDatabase("agg_tutorials_db"); MongoCollection<Document> orders = aggDB.getCollection("orders"); orders.insertMany( Arrays.asList( new Document("customer_id", "elise_smith@myemail.com") .append("orderdate", LocalDateTime.parse("2020-05-30T08:35:52")) .append("value", 231), new Document("customer_id", "elise_smith@myemail.com") .append("orderdate", LocalDateTime.parse("2020-01-13T09:32:07")) .append("value", 99), new Document("customer_id", "oranieri@warmmail.com") .append("orderdate", LocalDateTime.parse("2020-01-01T08:25:37")) .append("value", 63), new Document("customer_id", "tj@wheresmyemail.com") .append("orderdate", LocalDateTime.parse("2019-05-28T19:13:32")) .append("value", 2), new Document("customer_id", "tj@wheresmyemail.com") .append("orderdate", LocalDateTime.parse("2020-11-23T22:56:53")) .append("value", 187), new Document("customer_id", "tj@wheresmyemail.com") .append("orderdate", LocalDateTime.parse("2020-08-18T23:04:48")) .append("value", 4), new Document("customer_id", "elise_smith@myemail.com") .append("orderdate", LocalDateTime.parse("2020-12-26T08:55:46")) .append("value", 4), new Document("customer_id", "tj@wheresmyemail.com") .append("orderdate", LocalDateTime.parse("2021-02-28T07:49:32")) .append("value", 1024), new Document("customer_id", "elise_smith@myemail.com") .append("orderdate", LocalDateTime.parse("2020-10-03T13:49:44")) .append("value", 102) ) );
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo Kotlin . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Início rápido do driver Kotlin.
Para saber mais sobre como executar agregações no Driver Kotlin, consulte o guia Agregação.
Além do driver, você também deve adicionar as seguintes dependências ao seu arquivo build.gradle.kts
e recarregar seu projeto:
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") }
Depois de instalar o driver, crie um arquivo chamado AggTutorial.kt
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
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. 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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Conectar-se ao cluster do guia de início rápido do driver Kotlin.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
val uri = "mongodb+srv://mongodb-example:27017"
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Primeiro, crie uma classe de dados Kotlin para modelar os dados na coleção orders
:
data class Order( val customerID: String, val orderDate: LocalDateTime, val value: Int )
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
val orders = aggDB.getCollection<Order>("orders") orders.deleteMany(Filters.empty()) orders.insertMany( listOf( Order("elise_smith@myemail.com", LocalDateTime.parse("2020-05-30T08:35:52"), 231), Order("elise_smith@myemail.com", LocalDateTime.parse("2020-01-13T09:32:07"), 99), Order("oranieri@warmmail.com", LocalDateTime.parse("2020-01-01T08:25:37"), 63), Order("tj@wheresmyemail.com", LocalDateTime.parse("2019-05-28T19:13:32"), 2), Order("tj@wheresmyemail.com", LocalDateTime.parse("2020-11-23T22:56:53"), 187), Order("tj@wheresmyemail.com", LocalDateTime.parse("2020-08-18T23:04:48"), 4), Order("elise_smith@myemail.com", LocalDateTime.parse("2020-12-26T08:55:46"), 4), Order("tj@wheresmyemail.com", LocalDateTime.parse("2021-02-28T07:49:32"), 1024), Order("elise_smith@myemail.com", LocalDateTime.parse("2020-10-03T13:49:44"), 102) ) )
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Node.js Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia de início rápido do driver do Node.js
Para saber mais sobre como realizar agregações no Driver Node.js, consulte o Guia de agregação.
Depois de instalar o driver, crie um arquivo para executar o modelo de tutorial. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
const { MongoClient } = require('mongodb'); // Replace the placeholder with your connection string. const uri = '<connection-string>'; const client = new MongoClient(uri); export 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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia de Início Rápido do Node.js
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
const uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
const orders = aggDB.collection('orders'); await orders.insertMany([ { customer_id: 'elise_smith@myemail.com', orderdate: new Date('2020-05-30T08:35:52Z'), value: 231, }, { customer_id: 'elise_smith@myemail.com', orderdate: new Date('2020-01-13T09:32:07Z'), value: 99, }, { customer_id: 'oranieri@warmmail.com', orderdate: new Date('2020-01-01T08:25:37Z'), value: 63, }, { customer_id: 'tj@wheresmyemail.com', orderdate: new Date('2019-05-28T19:13:32Z'), value: 2, }, { customer_id: 'tj@wheresmyemail.com', orderdate: new Date('2020-11-23T22:56:53Z'), value: 187, }, { customer_id: 'tj@wheresmyemail.com', orderdate: new Date('2020-08-18T23:04:48Z'), value: 4, }, { customer_id: 'elise_smith@myemail.com', orderdate: new Date('2020-12-26T08:55:46Z'), value: 4, }, { customer_id: 'tj@wheresmyemail.com', orderdate: new Date('2021-02-29T07:49:32Z'), value: 1024, }, { customer_id: 'elise_smith@myemail.com', orderdate: new Date('2020-10-03T13:49:44Z'), value: 102, }, ]);
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo PHP. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar a biblioteca PHP e se conectar ao MongoDB, consulte o tutorial Introdução à biblioteca PHP.
Para saber mais sobre como realizar agregações na biblioteca PHP, consulte o Guia de agregação.
Depois de instalar a biblioteca, crie um arquivo chamado agg_tutorial.php
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão de seu sistema, consulte a etapa Criar uma connection string do tutorial de Introdução à biblioteca PHP.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
$uri = 'mongodb+srv://mongodb-example:27017';
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
$orders = $client->agg_tutorials_db->orders; $orders->deleteMany([]); $orders->insertMany( [ [ 'customer_id' => 'elise_smith@myemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-05-30T08:35:52')), 'value' => 231 ], [ 'customer_id' => 'elise_smith@myemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-01-13T09:32:07')), 'value' => 99 ], [ 'customer_id' => 'oranieri@warmmail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-01-01T08:25:37')), 'value' => 63 ], [ 'customer_id' => 'tj@wheresmyemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2019-05-28T19:13:32')), 'value' => 2 ], [ 'customer_id' => 'tj@wheresmyemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-11-23T22:56:53')), 'value' => 187 ], [ 'customer_id' => 'tj@wheresmyemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-08-18T23:04:48')), 'value' => 4 ], [ 'customer_id' => 'elise_smith@myemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-12-26T08:55:46')), 'value' => 4 ], [ 'customer_id' => 'tj@wheresmyemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2021-02-28T07:49:32')), 'value' => 1024 ], [ 'customer_id' => 'elise_smith@myemail.com', 'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-10-03T13:49:44')), 'value' => 102 ] ] );
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Python. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o PyMongo e se conectar ao MongoDB, consulte o tutorial Introdução ao PyMongo.
Para saber mais sobre como realizar agregações no PyMongo, consulte o Guia de agregação.
Depois de instalar a biblioteca, crie um arquivo chamado agg_tutorial.py
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
# 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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão de seu sistema, consulte a etapa Criar uma connection string do tutorial de Introdução à biblioteca PHP.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
uri = "mongodb+srv://mongodb-example:27017"
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
orders_coll = agg_db["orders"] order_data = [ { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 5, 30, 8, 35, 52), "value": 231, }, { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 1, 13, 9, 32, 7), "value": 99, }, { "customer_id": "oranieri@warmmail.com", "orderdate": datetime(2020, 1, 1, 8, 25, 37), "value": 63, }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2019, 5, 28, 19, 13, 32), "value": 2, }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2020, 11, 23, 22, 56, 53), "value": 187, }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2020, 8, 18, 23, 4, 48), "value": 4, }, { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 12, 26, 8, 55, 46), "value": 4, }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2021, 2, 28, 7, 49, 32), "value": 1024, }, { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 10, 3, 13, 49, 44), "value": 102, }, ] orders_coll.insert_many(order_data)
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Ruby. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o Ruby Driver e se conectar ao MongoDB, consulte o guia Introdução ao Ruby Driver.
Para saber mais sobre como realizar agregações no Driver Ruby, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg_tutorial.rb
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
# 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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia de Introdução ao Ruby.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
uri = "mongodb+srv://mongodb-example:27017"
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
orders = agg_db[:orders] orders.delete_many({}) orders.insert_many( [ { customer_id: "elise_smith@myemail.com", orderdate: DateTime.parse("2020-05-30T08:35:52Z"), value: 231, }, { customer_id: "elise_smith@myemail.com", orderdate: DateTime.parse("2020-01-13T09:32:07Z"), value: 99, }, { customer_id: "oranieri@warmmail.com", orderdate: DateTime.parse("2020-01-01T08:25:37Z"), value: 63, }, { customer_id: "tj@wheresmyemail.com", orderdate: DateTime.parse("2019-05-28T19:13:32Z"), value: 2, }, { customer_id: "tj@wheresmyemail.com", orderdate: DateTime.parse("2020-11-23T22:56:53Z"), value: 187, }, { customer_id: "tj@wheresmyemail.com", orderdate: DateTime.parse("2020-08-18T23:04:48Z"), value: 4, }, { customer_id: "elise_smith@myemail.com", orderdate: DateTime.parse("2020-12-26T08:55:46Z"), value: 4, }, { customer_id: "tj@wheresmyemail.com", orderdate: DateTime.parse("2021-02-28T07:49:32Z"), value: 1024, }, { customer_id: "elise_smith@myemail.com", orderdate: DateTime.parse("2020-10-03T13:49:44Z"), value: 102, }, ] )
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Rust. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Início Rápido do Driver Rust.
Para saber mais sobre como realizar agregações no Driver Rust, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg-tutorial.rs
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
use mongodb::{ bson::{doc, Document}, options::ClientOptions, Client, }; use futures::stream::TryStreamExt; use std::error::Error; // Define structs. // #[derive(Debug, Serialize, Deserialize)] // struct MyStruct { ... } 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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia Rust Quick Start.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
let uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Primeiro, crie uma estrutura Rust para modelar os dados na collection orders
:
struct Order { customer_id: String, orderdate: DateTime, value: i32, }
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
let orders: Collection<Order> = agg_db.collection("orders"); orders.delete_many(doc! {}).await?; let docs = vec![ Order { customer_id: "elise_smith@myemail.com".to_string(), orderdate: DateTime::builder().year(2020).month(5).day(30).hour(8).minute(35).second(53).build().unwrap(), value: 231, }, Order { customer_id: "elise_smith@myemail.com".to_string(), orderdate: DateTime::builder().year(2020).month(1).day(13).hour(9).minute(32).second(7).build().unwrap(), value: 99, }, Order { customer_id: "oranieri@warmmail.com".to_string(), orderdate: DateTime::builder().year(2020).month(1).day(1).hour(8).minute(25).second(37).build().unwrap(), value: 63, }, Order { customer_id: "tj@wheresmyemail.com".to_string(), orderdate: DateTime::builder().year(2019).month(5).day(28).hour(19).minute(13).second(32).build().unwrap(), value: 2, }, Order { customer_id: "tj@wheresmyemail.com".to_string(), orderdate: DateTime::builder().year(2020).month(11).day(23).hour(22).minute(56).second(53).build().unwrap(), value: 187, }, Order { customer_id: "tj@wheresmyemail.com".to_string(), orderdate: DateTime::builder().year(2020).month(8).day(18).hour(23).minute(4).second(48).build().unwrap(), value: 4, }, Order { customer_id: "elise_smith@myemail.com".to_string(), orderdate: DateTime::builder().year(2020).month(12).day(26).hour(8).minute(55).second(46).build().unwrap(), value: 4, }, Order { customer_id: "tj@wheresmyemail.com".to_string(), orderdate: DateTime::builder().year(2021).month(2).day(28).hour(7).minute(49).second(32).build().unwrap(), value: 1024, }, Order { customer_id: "elise_smith@myemail.com".to_string(), orderdate: DateTime::builder().year(2020).month(10).day(3).hour(13).minute(49).second(44).build().unwrap(), value: 102, }, ]; orders.insert_many(docs).await?;
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo Scala. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Introdução ao driver Scala.
Para saber mais sobre como executar agregações no Driver Scala, consulte o Guia de agregação.
Depois de instalar o driver, crie um arquivo chamado AggTutorial.scala
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
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, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia de Introdução do driver Scala.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
val uri = "mongodb+srv://mongodb-example:27017"
Criar a coleção
Este exemplo utiliza uma coleção orders
, que contém documentos descrevendo pedidos de produtos individuais. Como cada pedido corresponde a apenas um cliente, a agregação agrupa os documentos do pedido pelo campo customer_id
, que contém endereços de e-mail dos cliente .
Para criar a coleção orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
val orders = aggDB.getCollection("orders") orders.deleteMany(Filters.empty()).subscribe( _ => {}, e => println("Error: " + e.getMessage), ) val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") orders.insertMany(Seq( Document("customer_id" -> "elise_smith@myemail.com", "orderdate" -> dateFormat.parse("2020-05-30T08:35:52"), "value" -> 231), Document("customer_id" -> "elise_smith@myemail.com", "orderdate" -> dateFormat.parse("2020-01-13T09:32:07"), "value" -> 99), Document("customer_id" -> "oranieri@warmmail.com", "orderdate" -> dateFormat.parse("2020-01-01T08:25:37"), "value" -> 63), Document("customer_id" -> "tj@wheresmyemail.com", "orderdate" -> dateFormat.parse("2019-05-28T19:13:32"), "value" -> 2), Document("customer_id" -> "tj@wheresmyemail.com", "orderdate" -> dateFormat.parse("2020-11-23T22:56:53"), "value" -> 187), Document("customer_id" -> "tj@wheresmyemail.com", "orderdate" -> dateFormat.parse("2020-08-18T23:04:48"), "value" -> 4), Document("customer_id" -> "elise_smith@myemail.com", "orderdate" -> dateFormat.parse("2020-12-26T08:55:46"), "value" -> 4), Document("customer_id" -> "tj@wheresmyemail.com", "orderdate" -> dateFormat.parse("2021-02-28T07:49:32"), "value" -> 1024), Document("customer_id" -> "elise_smith@myemail.com", "orderdate" -> dateFormat.parse("2020-10-03T13:49:44"), "value" -> 102) )).subscribe( _ => {}, e => println("Error: " + e.getMessage), )
Passos
As etapas a seguir demonstram como criar e executar um pipeline de agregação para agrupar documentos e calcular novos campos.
Execute o agregação pipeline.
db.orders.aggregate( [ // Stage 1: Match orders in 2020 { $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), } } }, // Stage 2: Sort orders by date { $sort: { orderdate: 1 } }, // Stage 3: Group orders by email address (customer_id) { $group: { _id: "$customer_id", first_purchase_date: { $first: "$orderdate" }, total_value: { $sum: "$value" }, total_orders: { $sum: 1 }, orders: { $push: { orderdate: "$orderdate", value: "$value" } } } }, // Stage 4: Sort orders by first order date { $sort: { first_purchase_date: 1 } }, // Stage 5: Display the customers' email addresses { $set: { customer_id: "$_id" } }, // Stage 6: Remove unneeded fields { $unset: ["_id"] } ] )
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020. Os documentos de resultado contêm detalhes de todos os pedidos feitos por um determinado cliente, agrupados pelo endereço de e-mail do cliente.
{ first_purchase_date: ISODate("2020-01-01T08:25:37.000Z"), total_value: 63, total_orders: 1, orders: [ { orderdate: ISODate("2020-01-01T08:25:37.000Z"), value: 63 } ], customer_id: 'oranieri@warmmail.com' } { first_purchase_date: ISODate("2020-01-13T09:32:07.000Z"), total_value: 436, total_orders: 4, orders: [ { orderdate: ISODate("2020-01-13T09:32:07.000Z"), value: 99 }, { orderdate: ISODate("2020-05-30T08:35:52.000Z"), value: 231 }, { orderdate: ISODate("2020-10-03T13:49:44.000Z"), value: 102 }, { orderdate: ISODate("2020-12-26T08:55:46.000Z"), value: 4 } ], customer_id: 'elise_smith@myemail.com' } { first_purchase_date: ISODate("2020-08-18T23:04:48.000Z"), total_value: 191, total_orders: 2, orders: [ { orderdate: ISODate("2020-08-18T23:04:48.000Z"), value: 4 }, { orderdate: ISODate("2020-11-23T22:56:53.000Z"), value: 187 } ], customer_id: 'tj@wheresmyemail.com' }
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
"{", "$match", "{", "orderdate", "{", "$gte", BCON_DATE_TIME(1577836800000UL), // Represents 2020-01-01T00:00:00Z "$lt", BCON_DATE_TIME(1609459200000UL), // Represents 2021-01-01T00:00:00Z "}", "}", "}",
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
"{", "$sort", "{", "orderdate", BCON_INT32(1), "}", "}",
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
"{", "$group", "{", "_id", BCON_UTF8("$customer_id"), "first_purchase_date", "{", "$first", BCON_UTF8("$orderdate"), "}", "total_value", "{", "$sum", BCON_UTF8("$value"), "}", "total_orders", "{", "$sum", BCON_INT32(1), "}", "orders", "{", "$push", "{", "orderdate", BCON_UTF8("$orderdate"), "value", BCON_UTF8("$value"), "}", "}", "}", "}",
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
"{", "$sort", "{", "first_purchase_date", BCON_INT32(1), "}", "}",
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
"{", "$set", "{", "customer_id", BCON_UTF8("$_id"), "}", "}",
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
"{", "$unset", "[", BCON_UTF8("_id"), "]", "}",
Execute o agregação pipeline.
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders
:
mongoc_cursor_t *results = mongoc_collection_aggregate(orders, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy(pipeline);
Certifique-se de limpar os recursos de coleta adicionando a seguinte linha às declarações de limpeza:
mongoc_collection_destroy(orders);
Por fim, execute os seguintes comandos em seu shell para gerar e executar o executável:
gcc -o aggc agg-tutorial.c $(pkg-config --libs --cflags libmongoc-1.0) ./aggc
Dica
Se você encontrar erros de conexão ao executar os comandos anteriores em uma chamada, poderá executá-los separadamente.
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{ "first_purchase_date" : { "$date" : { "$numberLong" : "1577865937000" } }, "total_value" : { "$numberInt" : "63" }, "total_orders" : { "$numberInt" : "1" }, "orders" : [ { "orderdate" : { "$date" : { "$numberLong" : "1577865937000" } }, "value" : { "$numberInt" : "63" } } ], "customer_id" : "oranieri@warmmail.com" } { "first_purchase_date" : { "$date" : { "$numberLong" : "1578904327000" } }, "total_value" : { "$numberInt" : "436" }, "total_orders" : { "$numberInt" : "4" }, "orders" : [ { "orderdate" : { "$date" : { "$numberLong" : "1578904327000" } }, "value" : { "$numberInt" : "99" } }, { "orderdate" : { "$date" : { "$numberLong" : "1590825352000" } }, "value" : { "$numberInt" : "231" } }, { "orderdate" : { "$date" : { "$numberLong" : "1601722184000" } }, "value" : { "$numberInt" : "102" } }, { "orderdate" : { "$date" : { "$numberLong" : "1608963346000" } }, "value" : { "$numberInt" : "4" } } ], "customer_id" : "elise_smith@myemail.com" } { "first_purchase_date" : { "$date" : { "$numberLong" : "1597793088000" } }, "total_value" : { "$numberInt" : "191" }, "total_orders" : { "$numberInt" : "2" }, "orders" : [ { "orderdate" : { "$date" : { "$numberLong" : "1597793088000" } }, "value" : { "$numberInt" : "4" } }, { "orderdate" : { "$date" : { "$numberLong" : "1606171013000" } }, "value" : { "$numberInt" : "187" } } ], "customer_id" : "tj@wheresmyemail.com" }
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
pipeline.match(bsoncxx::from_json(R"({ "orderdate": { "$gte": {"$date": 1577836800}, "$lt": {"$date": 1609459200000} } })"));
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
pipeline.sort(bsoncxx::from_json(R"({ "orderdate": 1 })"));
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
pipeline.group(bsoncxx::from_json(R"({ "_id": "$customer_id", "first_purchase_date": {"$first": "$orderdate"}, "total_value": {"$sum": "$value"}, "total_orders": {"$sum": 1}, "orders": {"$push": { "orderdate": "$orderdate", "value": "$value" }} })"));
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
pipeline.sort(bsoncxx::from_json(R"({ "first_purchase_date": 1 })"));
Adicione um estágio addFields para exibir o endereço de e-mail.
Adicione um estágio $addFields
, um alias para o estágio $set
, para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
pipeline.add_fields(bsoncxx::from_json(R"({ "customer_id": "$_id" })"));
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.append_stage(bsoncxx::from_json(R"({ "$unset": ["_id"] })"));
Execute o agregação pipeline.
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders
:
auto cursor = orders.aggregate(pipeline);
Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:
c++ --std=c++17 agg-tutorial.cpp $(pkg-config --cflags --libs libmongocxx) -o ./app.out ./app.out
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{ "first_purchase_date" : { "$date" : "1970-01-19T06:17:41.137Z" }, "total_value" : 63, "total_orders" : 1, "orders" : [ { "orderdate" : { "$date" : "1970-01-19T06:17:41.137Z" }, "value" : 63 } ], "customer_id" : "oranieri@warmmail.com" } { "first_purchase_date" : { "$date" : "1970-01-19T06:35:01.927Z" }, "total_value" : 436, "total_orders" : 4, "orders" : [ { "orderdate" : { "$date" : "1970-01-19T06:35:01.927Z" }, "value" : 99 }, { "orderdate" : { "$date" : "2020-05-30T06:55:52Z" }, "value" : 231 }, { "orderdate" : { "$date" : "2020-10-03T10:49:44Z" }, "value" : 102 }, { "orderdate" : { "$date" : "2020-12-26T08:55:46Z" }, "value" : 4 } ], "customer_id" : "elise_smith@myemail.com" } { "first_purchase_date" : { "$date" : "1970-01-19T11:49:54.288Z" }, "total_value" : 1215, "total_orders" : 3, "orders" : [ { "orderdate" : { "$date" : "1970-01-19T11:49:54.288Z" }, "value" : 4 }, { "orderdate" : { "$date" : "1970-01-19T14:09:32.213Z" }, "value" : 187 }, { "orderdate" : { "$date" : "1970-01-19T16:29:30.572Z" }, "value" : 1024 } ], "customer_id" : "tj@wheresmyemail.com" }
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, inicie a agregação na coleção orders
e encadeie um estágio $match
que corresponda aos pedidos colocados em 2020:
var results = orders.Aggregate() .Match(o => o.OrderDate >= DateTime.Parse("2020-01-01T00:00:00Z") && o.OrderDate < DateTime.Parse("2021-01-01T00:00:00Z"))
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo OrderDate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
.SortBy(o => o.OrderDate)
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo CustomerId
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
CustomerId
: o endereço de e-mail do cliente (a chave de agrupamento)FirstPurchaseDate
: a data da primeira compra do clienteTotalValue
: o valor total de todas as compras do clienteTotalOrders
: o número total de compras do clienteOrders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
.Group( o => o.CustomerId, g => new { CustomerId = g.Key, FirstPurchaseDate = g.First().OrderDate, TotalValue = g.Sum(i => i.Value), TotalOrders = g.Count(), Orders = g.Select(i => new { i.OrderDate, i.Value }).ToList() } )
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo FirstPurchaseDate
:
.SortBy(c => c.FirstPurchaseDate) .As<BsonDocument>();
O código anterior também converte os documentos de saída em instâncias BsonDocument
para impressão.
Execute a agregação e interprete os resultados.
Por fim, execute o aplicação em seu IDE e inspecione os resultados.
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{ "CustomerId" : "oranieri@warmmail.com", "FirstPurchaseDate" : { "$date" : "2020-01-01T08:25:37Z" }, "TotalValue" : 63, "TotalOrders" : 1, "Orders" : [{ "OrderDate" : { "$date" : "2020-01-01T08:25:37Z" }, "Value" : 63 }] } { "CustomerId" : "elise_smith@myemail.com", "FirstPurchaseDate" : { "$date" : "2020-01-13T09:32:07Z" }, "TotalValue" : 436, "TotalOrders" : 4, "Orders" : [{ "OrderDate" : { "$date" : "2020-01-13T09:32:07Z" }, "Value" : 99 }, { "OrderDate" : { "$date" : "2020-05-30T08:35:52Z" }, "Value" : 231 }, { "OrderDate" : { "$date" : "2020-10-03T13:49:44Z" }, "Value" : 102 }, { "OrderDate" : { "$date" : "2020-12-26T08:55:46Z" }, "Value" : 4 }] } { "CustomerId" : "tj@wheresmyemail.com", "FirstPurchaseDate" : { "$date" : "2020-08-18T23:04:48Z" }, "TotalValue" : 191, "TotalOrders" : 2, "Orders" : [{ "OrderDate" : { "$date" : "2020-08-18T23:04:48Z" }, "Value" : 4 }, { "OrderDate" : { "$date" : "2020-11-23T22:56:53Z" }, "Value" : 187 }] }
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
matchStage := bson.D{{Key: "$match", Value: bson.D{ {Key: "orderdate", Value: bson.D{ {Key: "$gte", Value: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)}, {Key: "$lt", Value: time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)}, }}, }}}
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
sortStageOrderDate := bson.D{{Key: "$sort", Value: bson.D{ {Key: "orderdate", Value: 1}, }}}
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
groupStage := bson.D{{Key: "$group", Value: bson.D{ {Key: "_id", Value: "$customer_id"}, {Key: "first_purchase_date", Value: bson.D{{Key: "$first", Value: "$orderdate"}}}, {Key: "total_value", Value: bson.D{{Key: "$sum", Value: "$value"}}}, {Key: "total_orders", Value: bson.D{{Key: "$sum", Value: 1}}}, {Key: "orders", Value: bson.D{{Key: "$push", Value: bson.D{ {Key: "orderdate", Value: "$orderdate"}, {Key: "value", Value: "$value"}, }}}}, }}}
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
sortStageFirstPurchaseDate := bson.D{{Key: "$sort", Value: bson.D{ {Key: "first_purchase_date", Value: 1}, }}}
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
setStage := bson.D{{Key: "$set", Value: bson.D{ {Key: "customer_id", Value: "$_id"}, }}}
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
unsetStage := bson.D{{Key: "$unset", Value: bson.A{"_id"}}}
Execute o agregação pipeline.
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders
:
pipeline := mongo.Pipeline{ matchStage, sortStageOrderDate, groupStage, sortStageFirstPurchaseDate, setStage, unsetStage, } cursor, err := orders.Aggregate(ctx, pipeline)
Por fim, execute o aplicação e inspecione os resultados.
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{"first_purchase_date":{"$date":"2020-01-01T08:25:37Z"},"total_value":63,"total_orders":1,"orders":[{"orderdate":{"$date":"2020-01-01T08:25:37Z"},"value":63}],"customer_id":"oranieri@warmmail.com"} {"first_purchase_date":{"$date":"2020-01-13T09:32:07Z"},"total_value":436,"total_orders":4,"orders":[{"orderdate":{"$date":"2020-01-13T09:32:07Z"},"value":99},{"orderdate":{"$date":"2020-05-30T08:35:53Z"},"value":231},{"orderdate":{"$date":"2020-10-03T13:49:44Z"},"value":102},{"orderdate":{"$date":"2020-12-26T08:55:46Z"},"value":4}],"customer_id":"elise_smith@myemail.com"} {"first_purchase_date":{"$date":"2020-08-18T23:04:48Z"},"total_value":191,"total_orders":2,"orders":[{"orderdate":{"$date":"2020-08-18T23:04:48Z"},"value":4},{"orderdate":{"$date":"2020-11-23T22:56:53Z"},"value":187}],"customer_id":"tj@wheresmyemail.com"}
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
pipeline.add(Aggregates.match(Filters.and( Filters.gte("orderdate", LocalDateTime.parse("2020-01-01T00:00:00")), Filters.lt("orderdate", LocalDateTime.parse("2021-01-01T00:00:00")) )));
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
pipeline.add(Aggregates.sort(Sorts.ascending("orderdate")));
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
pipeline.add(Aggregates.group( "$customer_id", Accumulators.first("first_purchase_date", "$orderdate"), Accumulators.sum("total_value", "$value"), Accumulators.sum("total_orders", 1), Accumulators.push("orders", new Document("orderdate", "$orderdate") .append("value", "$value") ) ));
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
pipeline.add(Aggregates.sort(Sorts.ascending("first_purchase_date")));
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
pipeline.add(Aggregates.set(new Field<>("customer_id", "$_id")));
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.add(Aggregates.unset("_id"));
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{"first_purchase_date": {"$date": "2020-01-01T08:25:37Z"}, "total_value": 63, "total_orders": 1, "orders": [{"orderdate": {"$date": "2020-01-01T08:25:37Z"}, "value": 63}], "customer_id": "oranieri@warmmail.com"} {"first_purchase_date": {"$date": "2020-01-13T09:32:07Z"}, "total_value": 436, "total_orders": 4, "orders": [{"orderdate": {"$date": "2020-01-13T09:32:07Z"}, "value": 99}, {"orderdate": {"$date": "2020-05-30T08:35:52Z"}, "value": 231}, {"orderdate": {"$date": "2020-10-03T13:49:44Z"}, "value": 102}, {"orderdate": {"$date": "2020-12-26T08:55:46Z"}, "value": 4}], "customer_id": "elise_smith@myemail.com"} {"first_purchase_date": {"$date": "2020-08-18T23:04:48Z"}, "total_value": 191, "total_orders": 2, "orders": [{"orderdate": {"$date": "2020-08-18T23:04:48Z"}, "value": 4}, {"orderdate": {"$date": "2020-11-23T22:56:53Z"}, "value": 187}], "customer_id": "tj@wheresmyemail.com"}
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
pipeline.add( Aggregates.match( Filters.and( Filters.gte(Order::orderDate.name, LocalDateTime.parse("2020-01-01T00:00:00").toJavaLocalDateTime()), Filters.lt(Order::orderDate.name, LocalDateTime.parse("2021-01-01T00:00:00").toJavaLocalDateTime()) ) ) )
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderDate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
pipeline.add(Aggregates.sort(Sorts.ascending(Order::orderDate.name)))
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
pipeline.add( Aggregates.group( "\$${Order::customerID.name}", Accumulators.first("first_purchase_date", "\$${Order::orderDate.name}"), Accumulators.sum("total_value", "\$${Order::value.name}"), Accumulators.sum("total_orders", 1), Accumulators.push( "orders", Document("orderdate", "\$${Order::orderDate.name}") .append("value", "\$${Order::value.name}") ) ) )
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
pipeline.add(Aggregates.sort(Sorts.ascending("first_purchase_date")))
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
pipeline.add(Aggregates.set(Field("customer_id", "\$_id")))
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.add(Aggregates.unset("_id"))
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
Document{{first_purchase_date=Wed Jan 01 03:25:37 EST 2020, total_value=63, total_orders=1, orders=[Document{{orderdate=Wed Jan 01 03:25:37 EST 2020, value=63}}], customer_id=oranieri@warmmail.com}} Document{{first_purchase_date=Mon Jan 13 04:32:07 EST 2020, total_value=436, total_orders=4, orders=[Document{{orderdate=Mon Jan 13 04:32:07 EST 2020, value=99}}, Document{{orderdate=Sat May 30 04:35:52 EDT 2020, value=231}}, Document{{orderdate=Sat Oct 03 09:49:44 EDT 2020, value=102}}, Document{{orderdate=Sat Dec 26 03:55:46 EST 2020, value=4}}], customer_id=elise_smith@myemail.com}} Document{{first_purchase_date=Tue Aug 18 19:04:48 EDT 2020, total_value=191, total_orders=2, orders=[Document{{orderdate=Tue Aug 18 19:04:48 EDT 2020, value=4}}, Document{{orderdate=Mon Nov 23 17:56:53 EST 2020, value=187}}], customer_id=tj@wheresmyemail.com}}
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
pipeline.push({ $group: { _id: '$customer_id', first_purchase_date: { $first: '$orderdate' }, total_value: { $sum: '$value' }, total_orders: { $sum: 1 }, orders: { $push: { orderdate: '$orderdate', value: '$value', }, }, }, });
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
pipeline.push({ $sort: { orderdate: 1, }, });
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um estágio $group
para agrupar os pedidos pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
pipeline.push({ $group: { _id: '$customer_id', first_purchase_date: { $first: '$orderdate' }, total_value: { $sum: '$value' }, total_orders: { $sum: 1 }, orders: { $push: { orderdate: '$orderdate', value: '$value', }, }, }, });
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
pipeline.push({ $sort: { first_purchase_date: 1, }, });
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
pipeline.push({ $set: { customer_id: '$_id', }, });
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.push({ $unset: ['_id'] });
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{ first_purchase_date: 2020-01-01T08:25:37.000Z, total_value: 63, total_orders: 1, orders: [ { orderdate: 2020-01-01T08:25:37.000Z, value: 63 } ], customer_id: 'oranieri@warmmail.com' } { first_purchase_date: 2020-01-13T09:32:07.000Z, total_value: 436, total_orders: 4, orders: [ { orderdate: 2020-01-13T09:32:07.000Z, value: 99 }, { orderdate: 2020-05-30T08:35:52.000Z, value: 231 }, { orderdate: 2020-10-03T13:49:44.000Z, value: 102 }, { orderdate: 2020-12-26T08:55:46.000Z, value: 4 } ], customer_id: 'elise_smith@myemail.com' } { first_purchase_date: 2020-08-18T23:04:48.000Z, total_value: 191, total_orders: 2, orders: [ { orderdate: 2020-08-18T23:04:48.000Z, value: 4 }, { orderdate: 2020-11-23T22:56:53.000Z, value: 187 } ], customer_id: 'tj@wheresmyemail.com' }
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Na sua instância Pipeline
, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
Stage::match( orderdate: [ Query::gte(new UTCDateTime(new DateTimeImmutable('2020-01-01T00:00:00'))), Query::lt(new UTCDateTime(new DateTimeImmutable('2021-01-01T00:00:00'))), ] ),
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
Stage::sort(orderdate: Sort::Asc),
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Fora de sua instância Pipeline
, crie um $group
estágio em uma função de fábrica para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
function groupByCustomerStage() { return Stage::group( _id: Expression::stringFieldPath('customer_id'), first_purchase_date: Accumulator::first( Expression::arrayFieldPath('orderdate') ), total_value: Accumulator::sum( Expression::numberFieldPath('value'), ), total_orders: Accumulator::sum(1), orders: Accumulator::push( object( orderdate: Expression::dateFieldPath('orderdate'), value: Expression::numberFieldPath('value'), ), ), ); }
Em seguida, na sua instância do Pipeline
, chame a função groupByCustomerStage()
:
groupByCustomerStage(),
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, crie outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
Stage::sort(first_purchase_date: Sort::Asc),
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
Stage::set(customer_id: Expression::stringFieldPath('_id')),
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
Stage::unset('_id')
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{ "first_purchase_date": { "$date": { "$numberLong": "1577867137000" } }, "total_value": 63, "total_orders": 1, "orders": [ { "orderdate": { "$date": { "$numberLong": "1577867137000" } }, "value": 63 } ], "customer_id": "oranieri@warmmail.com" } { "first_purchase_date": { "$date": { "$numberLong": "1578907927000" } }, "total_value": 436, "total_orders": 4, "orders": [ { "orderdate": { "$date": { "$numberLong": "1578907927000" } }, "value": 99 }, { "orderdate": { "$date": { "$numberLong": "1590827752000" } }, "value": 231 }, { "orderdate": { "$date": { "$numberLong": "1601732984000" } }, "value": 102 }, { "orderdate": { "$date": { "$numberLong": "1608972946000" } }, "value": 4 } ], "customer_id": "elise_smith@myemail.com" } { "first_purchase_date": { "$date": { "$numberLong": "1597791888000" } }, "total_value": 191, "total_orders": 2, "orders": [ { "orderdate": { "$date": { "$numberLong": "1597791888000" } }, "value": 4 }, { "orderdate": { "$date": { "$numberLong": "1606172213000" } }, "value": 187 } ], "customer_id": "tj@wheresmyemail.com" }
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Na sua instância Pipeline
, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
pipeline.append( { "$match": { "orderdate": { "$gte": datetime(2020, 1, 1, 0, 0, 0), "$lt": datetime(2021, 1, 1, 0, 0, 0), } } } )
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
pipeline.append({"$sort": {"orderdate": 1}})
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um estágio $group
para agrupar os pedidos pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
pipeline.append( { "$group": { "_id": "$customer_id", "first_purchase_date": {"$first": "$orderdate"}, "total_value": {"$sum": "$value"}, "total_orders": {"$sum": 1}, "orders": {"$push": {"orderdate": "$orderdate", "value": "$value"}}, } } )
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, crie outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
pipeline.append({"$sort": {"first_purchase_date": 1}})
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
pipeline.append({"$set": {"customer_id": "$_id"}})
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.append({"$unset": ["_id"]})
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{'first_purchase_date': datetime.datetime(2020, 1, 1, 8, 25, 37), 'total_value': 63, 'total_orders': 1, 'orders': [{'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37), 'value': 63}], 'customer_id': 'oranieri@warmmail.com'} {'first_purchase_date': datetime.datetime(2020, 1, 13, 9, 32, 7), 'total_value': 436, 'total_orders': 4, 'orders': [{'orderdate': datetime.datetime(2020, 1, 13, 9, 32, 7), 'value': 99}, {'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52), 'value': 231}, {'orderdate': datetime.datetime(2020, 10, 3, 13, 49, 44), 'value': 102}, {'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46), 'value': 4}], 'customer_id': 'elise_smith@myemail.com'} {'first_purchase_date': datetime.datetime(2020, 8, 18, 23, 4, 48), 'total_value': 191, 'total_orders': 2, 'orders': [{'orderdate': datetime.datetime(2020, 8, 18, 23, 4, 48), 'value': 4}, {'orderdate': datetime.datetime(2020, 11, 23, 22, 56, 53), 'value': 187}], 'customer_id': 'tj@wheresmyemail.com'}
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
{ "$match": { orderdate: { "$gte": DateTime.parse("2020-01-01T00:00:00Z"), "$lt": DateTime.parse("2021-01-01T00:00:00Z"), }, }, },
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
{ "$sort": { orderdate: 1, }, },
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
{ "$group": { _id: "$customer_id", first_purchase_date: { "$first": "$orderdate" }, total_value: { "$sum": "$value" }, total_orders: { "$sum": 1 }, orders: { "$push": { orderdate: "$orderdate", value: "$value", } }, }, },
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
{ "$sort": { first_purchase_date: 1, }, },
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
{ "$set": { customer_id: "$_id", }, },
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
{ "$unset": ["_id"] },
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{"first_purchase_date"=>2020-01-01 08:25:37 UTC, "total_value"=>63, "total_orders"=>1, "orders"=>[{"orderdate"=>2020-01-01 08:25:37 UTC, "value"=>63}], "customer_id"=>"oranieri@warmmail.com"} {"first_purchase_date"=>2020-01-13 09:32:07 UTC, "total_value"=>436, "total_orders"=>4, "orders"=>[{"orderdate"=>2020-01-13 09:32:07 UTC, "value"=>99}, {"orderdate"=>2020-05-30 08:35:52 UTC, "value"=>231}, {"orderdate"=>2020-10-03 13:49:44 UTC, "value"=>102}, {"orderdate"=>2020-12-26 08:55:46 UTC, "value"=>4}], "customer_id"=>"elise_smith@myemail.com"} {"first_purchase_date"=>2020-08-18 23:04:48 UTC, "total_value"=>191, "total_orders"=>2, "orders"=>[{"orderdate"=>2020-08-18 23:04:48 UTC, "value"=>4}, {"orderdate"=>2020-11-23 22:56:53 UTC, "value"=>187}], "customer_id"=>"tj@wheresmyemail.com"}
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
pipeline.push(doc! { "$match": { "orderdate": { "$gte": DateTime::builder().year(2020).month(1).day(1).build().unwrap(), "$lt": DateTime::builder().year(2021).month(1).day(1).build().unwrap(), } } });
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
pipeline.push(doc! { "$sort": { "orderdate": 1 } });
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
pipeline.push(doc! { "$group": { "_id": "$customer_id", "first_purchase_date": { "$first": "$orderdate" }, "total_value": { "$sum": "$value" }, "total_orders": { "$sum": 1 }, "orders": { "$push": { "orderdate": "$orderdate", "value": "$value" } } } });
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
pipeline.push(doc! { "$sort": { "first_purchase_date": 1 } });
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
pipeline.push(doc! { "$set": { "customer_id": "$_id" } });
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.push(doc! {"$unset": ["_id"] });
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
Document({"first_purchase_date": DateTime(2020-01-01 8:25:37.0 +00:00:00), "total_value": Int32(63), "total_orders": Int32(1), "orders": Array([Document({"orderdate": DateTime(2020-01-01 8:25:37.0 +00:00:00), "value": Int32(63)})]), "customer_id": String("oranieri@warmmail.com")}) Document({"first_purchase_date": DateTime(2020-01-13 9:32:07.0 +00:00:00), "total_value": Int32(436), "total_orders": Int32(4), "orders": Array([Document({"orderdate": DateTime(2020-01-13 9:32:07.0 +00:00:00), "value": Int32(99)}), Document({"orderdate": DateTime(2020-05-30 8:35:53.0 +00:00:00), "value": Int32(231)}), Document({"orderdate": DateTime(2020-10-03 13:49:44.0 +00:00:00), "value": Int32(102)}), Document({"orderdate": DateTime(2020-12-26 8:55:46.0 +00:00:00), "value": Int32(4)})]), "customer_id": String("elise_smith@myemail.com")}) Document({"first_purchase_date": DateTime(2020-08-18 23:04:48.0 +00:00:00), "total_value": Int32(191), "total_orders": Int32(2), "orders": Array([Document({"orderdate": DateTime(2020-08-18 23:04:48.0 +00:00:00), "value": Int32(4)}), Document({"orderdate": DateTime(2020-11-23 22:56:53.0 +00:00:00), "value": Int32(187)})]), "customer_id": String("tj@wheresmyemail.com")})
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Adicione um estágio de correspondência para pedidos em 2020.
Primeiro, adicione um estágio $match
que corresponda aos pedidos feitos em 2020:
Aggregates.filter(Filters.and( Filters.gte("orderdate", dateFormat.parse("2020-01-01T00:00:00")), Filters.lt("orderdate", dateFormat.parse("2021-01-01T00:00:00")) )),
Adicione um estágio de classificação para classificar por data do pedido.
Em seguida, adicione um $sort
estágio para definir uma classificação ascendente no campo orderdate
para recuperar a primeira compra 2020 para cada cliente no próximo estágio:
Aggregates.sort(Sorts.ascending("orderdate")),
Adicione um estágio de grupo para agrupar por endereço de e-mail.
Adicione um $group
estágio para coletar documentos de pedido pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
Aggregates.group( "$customer_id", Accumulators.first("first_purchase_date", "$orderdate"), Accumulators.sum("total_value", "$value"), Accumulators.sum("total_orders", 1), Accumulators.push("orders", Document("orderdate" -> "$orderdate", "value" -> "$value")) ),
Adicione um estágio de classificação para classificar por data do primeiro pedido.
Em seguida, adicione outro $sort
estágio para definir uma classificação ascendente no campo first_purchase_date
:
Aggregates.sort(Sorts.ascending("first_purchase_date")),
Adicione um estágio definido para exibir o endereço de e-mail.
Adicione um estágio $set
para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
Aggregates.set(Field("customer_id", "$_id")),
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio $unset
. O estágio $unset
remove o campo _id
dos documentos de resultado:
Aggregates.unset("_id")
Interprete os resultados da agregação .
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{"first_purchase_date": {"$date": "2020-01-01T13:25:37Z"}, "total_value": 63, "total_orders": 1, "orders": [{"orderdate": {"$date": "2020-01-01T13:25:37Z"}, "value": 63}], "customer_id": "oranieri@warmmail.com"} {"first_purchase_date": {"$date": "2020-01-13T14:32:07Z"}, "total_value": 436, "total_orders": 4, "orders": [{"orderdate": {"$date": "2020-01-13T14:32:07Z"}, "value": 99}, {"orderdate": {"$date": "2020-05-30T12:35:52Z"}, "value": 231}, {"orderdate": {"$date": "2020-10-03T17:49:44Z"}, "value": 102}, {"orderdate": {"$date": "2020-12-26T13:55:46Z"}, "value": 4}], "customer_id": "elise_smith@myemail.com"} {"first_purchase_date": {"$date": "2020-08-19T03:04:48Z"}, "total_value": 191, "total_orders": 2, "orders": [{"orderdate": {"$date": "2020-08-19T03:04:48Z"}, "value": 4}, {"orderdate": {"$date": "2020-11-24T03:56:53Z"}, "value": 187}], "customer_id": "tj@wheresmyemail.com"}
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.