Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ / /

Dados do grupo e total

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.

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


➤ 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,
}
] )

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.

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

Para cada tutorial, 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";

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]);
}
}

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.

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

Para cada tutorial, 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"};

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

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";

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
{
[BsonId]
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
}
});

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";

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)
}

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";

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)
)
);

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.
@Serializable
data class MyClass(
...
)
suspend fun main() {
// Replace the placeholder with your connection string.
val uri = "<connection string>"
MongoClient.create(uri).use { mongoClient ->
val aggDB = mongoClient.getDatabase("agg_tutorials_db")
// Get a reference to relevant collections.
// ... val someColl = ...
// Delete any existing documents in collections if needed.
// ... someColl.deleteMany(empty())
// Insert sample data into the collection or collections.
// ... someColl.insertMany( ... )
// Create an empty pipeline.
val pipeline = mutableListOf<Bson>()
// Add code to create pipeline stages.
// ... pipeline.add(...)
// Run the aggregation.
// ... val aggregationResult = someColl.aggregate<Document>(pipeline)
// Print the aggregation results.
aggregationResult.collect { println(it) }
}
}

Para cada tutorial, 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"

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:

@Serializable
data class Order(
val customerID: String,
@Contextual 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)
)
)

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";

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,
},
]);

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.

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

Para cada tutorial, 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';

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
]
]
);

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"

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)

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"

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,
},
]
)

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 { ... }
#[tokio::main]
async fn main() mongodb::error::Result<()> {
// Replace the placeholder with your connection string.
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
let agg_db = client.database("agg_tutorials_db");
// Get a reference to relevant collections.
// ... let some_coll: Collection<T> = agg_db.collection("...");
// ... let another_coll: Collection<T> = agg_db.collection("...");
// Delete any existing documents in collections if needed.
// ... some_coll.delete_many(doc! {}).await?;
// Insert sample data into the collection or collections.
// ... some_coll.insert_many(vec![...]).await?;
// Create an empty pipeline.
let mut pipeline = Vec::new();
// Add code to create pipeline stages.
// pipeline.push(doc! { ... });
// Run the aggregation and print the results.
let mut results = some_coll.aggregate(pipeline).await?;
while let Some(result) = results.try_next().await? {
println!("{:?}\n", result);
}
Ok(())
}

Para cada tutorial, 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";

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:

#[derive(Debug, Serialize, Deserialize)]
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?;

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"

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),
)

As etapas a seguir demonstram como criar e executar um pipeline de agregação para agrupar documentos e calcular novos campos.

1
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"] }
] )
2

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'
}
1

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
"}",
"}", "}",
2

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), "}", "}",
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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"),
"}", "}",
"}", "}",
4

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), "}", "}",
5

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"), "}", "}",
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

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

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.

8

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.

1

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}
}
})"));
2

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
})"));
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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"
}}
})"));
4

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
})"));
5

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"
})"));
6

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"]
})"));
7

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
8

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.

1

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"))
2

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)
3

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 cliente

  • TotalValue: o valor total de todas as compras do cliente

  • TotalOrders: o número total de compras do cliente

  • Orders: 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()
}
)
4

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.

5

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.

1

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)},
}},
}}}
2

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},
}}}
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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"},
}}}},
}}}
4

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},
}}}
5

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"},
}}}
6

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"}}}
7

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.

8

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.

1

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"))
)));
2

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")));
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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")
)
));
4

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")));
5

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")));
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

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

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

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

Por fim, execute o aplicação em seu IDE.

8

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.

1

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())
)
)
)
2

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)))
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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}")
)
)
)
4

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")))
5

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")))
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

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

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

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

Por fim, execute o aplicação em seu IDE.

8

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.

1

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',
},
},
},
});
2

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,
},
});
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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',
},
},
},
});
4

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,
},
});
5

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',
},
});
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

pipeline.push({ $unset: ['_id'] });
7

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

const aggregationResult = await orders.aggregate(pipeline);

Por fim, execute o código no arquivo usando seu IDE ou a linha de comando.

8

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.

1

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'))),
]
),
2

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),
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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(),
4

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),
5

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')),
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

Stage::unset('_id')
7

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

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

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

php agg_tutorial.php
8

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.

1

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),
}
}
}
)
2

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}})
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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"}},
}
}
)
4

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}})
5

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"}})
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

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

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

aggregation_result = orders_coll.aggregate(pipeline)

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

python3 agg_tutorial.py
8

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.

1

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"),
},
},
},
2

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,
},
},
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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",
} },
},
},
4

Em seguida, adicione outro $sort estágio para definir uma classificação ascendente no campo first_purchase_date:

{
"$sort": {
first_purchase_date: 1,
},
},
5

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",
},
},
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

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

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

aggregation_result = orders.aggregate(pipeline)

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

ruby agg_tutorial.rb
8

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.

1

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(),
}
}
});
2

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
}
});
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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"
}
}
}
});
4

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
}
});
5

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"
}
});
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

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

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

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

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

cargo run
8

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.

1

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"))
)),
2

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")),
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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"))
),
4

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")),
5

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")),
6

Finalmente, adicione um estágio $unset. O estágio $unset remove o campo _id dos documentos de resultado:

Aggregates.unset("_id")
7

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

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

Por fim, execute o aplicação em seu IDE.

8

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.

Voltar

Filtrar e subconjunto

Nesta página