Este tutorial ilustra como construir um pipeline de agregação , executar a agregação em uma coleção e exibir os resultados usando a linguagem de sua escolha.
Sobre esta tarefa
Este tutorial demonstra como combinar dados de uma collection que descreve informações do produto com outra collection que descreve pedidos de cliente . Os resultados mostram uma lista de produtos pedidos em 2020 e detalhes sobre cada pedido.
Esta agregação executa uma união de vários campos usando $lookup
. Uma união de vários campos ocorre quando há vários campos correspondentes nos documentos de duas collections. A agregação corresponde a estes documentos nos campos correspondentes e combina informações de ambos em um documento.
Antes de começar
➤ Use o menu suspenso Selecione seu idioma no canto superior direito para definir o idioma dos exemplos a seguir ou selecione MongoDB Shell.
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as orders
products
collections e, use o insertMany()
método:
db.orders.deleteMany({}) db.orders.insertMany( [ { customer_id: "[email protected]", orderdate: new Date("2020-05-30T08:35:52Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 431.43, }, { customer_id: "[email protected]", orderdate: new Date("2019-05-28T19:13:32Z"), product_name: "The Day Of The Triffids", product_variation: "2nd Edition", value: 5.01, }, { customer_id: "[email protected]", orderdate: new Date("2020-01-01T08:25:37Z"), product_name: "Morphy Richards Food Mixer", product_variation: "Deluxe", value: 63.13, }, { customer_id: "[email protected]", orderdate: new Date("2020-12-26T08:55:46Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 429.65, } ] )
db.products.deleteMany({}) db.products.insertMany( [ { name: "Asus Laptop", variation: "Ultra HD", category: "ELECTRONICS", description: "Great for watching movies" }, { name: "Asus Laptop", variation: "Standard Display", category: "ELECTRONICS", description: "Good value laptop for students" }, { name: "The Day Of The Triffids", variation: "1st Edition", category: "BOOKS", description: "Classic post-apocalyptic novel" }, { name: "The Day Of The Triffids", variation: "2nd Edition", category: "BOOKS", description: "Classic post-apocalyptic novel" }, { name: "Morphy Richards Food Mixer", variation: "Deluxe", category: "KITCHENWARE", description: "Luxury mixer turning good cakes into great" } ] )
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo C. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Introdução ao driver C.
Para saber mais sobre como realizar agregações no C Driver, consulte o Guia de agregação.
Depois de instalar o driver, crie um arquivo chamado agg-tutorial.c
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
int main(void) { mongoc_init(); // Replace the placeholder with your connection string. char *uri = "<connection string>"; mongoc_client_t* client = mongoc_client_new(uri); // Get a reference to relevant collections. // ... mongoc_collection_t *some_coll = mongoc_client_get_collection(client, "agg_tutorials_db", "some_coll"); // ... mongoc_collection_t *another_coll = mongoc_client_get_collection(client, "agg_tutorials_db", "another_coll"); // Delete any existing documents in collections if needed. // ... { // ... bson_t *filter = bson_new(); // ... bson_error_t error; // ... if (!mongoc_collection_delete_many(some_coll, filter, NULL, NULL, &error)) // ... { // ... fprintf(stderr, "Delete error: %s\n", error.message); // ... } // ... bson_destroy(filter); // ... } // Insert sample data into the collection or collections. // ... { // ... size_t num_docs = ...; // ... bson_t *docs[num_docs]; // ... // ... docs[0] = ...; // ... // ... bson_error_t error; // ... if (!mongoc_collection_insert_many(some_coll, (const bson_t **)docs, num_docs, NULL, NULL, &error)) // ... { // ... fprintf(stderr, "Insert error: %s\n", error.message); // ... } // ... // ... for (int i = 0; i < num_docs; i++) // ... { // ... bson_destroy(docs[i]); // ... } // ... } { const bson_t *doc; // Add code to create pipeline stages. bson_t *pipeline = BCON_NEW("pipeline", "[", // ... Add pipeline stages here. "]"); // Run the aggregation. // ... mongoc_cursor_t *results = mongoc_collection_aggregate(some_coll, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy(pipeline); // Print the aggregation results. while (mongoc_cursor_next(results, &doc)) { char *str = bson_as_canonical_extended_json(doc, NULL); printf("%s\n", str); bson_free(str); } bson_error_t error; if (mongoc_cursor_error(results, &error)) { fprintf(stderr, "Aggregation error: %s\n", error.message); } mongoc_cursor_destroy(results); } // Clean up resources. // ... mongoc_collection_destroy(some_coll); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma cadeia de conexão do guia de Introdução C.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
char *uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
mongoc_collection_t *products = mongoc_client_get_collection(client, "agg_tutorials_db", "products"); 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(products, filter, NULL, NULL, &error)) { fprintf(stderr, "Delete error: %s\n", error.message); } 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 = 5; bson_t *product_docs[num_docs]; product_docs[0] = BCON_NEW( "name", BCON_UTF8("Asus Laptop"), "variation", BCON_UTF8("Ultra HD"), "category", BCON_UTF8("ELECTRONICS"), "description", BCON_UTF8("Great for watching movies")); product_docs[1] = BCON_NEW( "name", BCON_UTF8("Asus Laptop"), "variation", BCON_UTF8("Standard Display"), "category", BCON_UTF8("ELECTRONICS"), "description", BCON_UTF8("Good value laptop for students")); product_docs[2] = BCON_NEW( "name", BCON_UTF8("The Day Of The Triffids"), "variation", BCON_UTF8("1st Edition"), "category", BCON_UTF8("BOOKS"), "description", BCON_UTF8("Classic post-apocalyptic novel")); product_docs[3] = BCON_NEW( "name", BCON_UTF8("The Day Of The Triffids"), "variation", BCON_UTF8("2nd Edition"), "category", BCON_UTF8("BOOKS"), "description", BCON_UTF8("Classic post-apocalyptic novel")); product_docs[4] = BCON_NEW( "name", BCON_UTF8("Morphy Richards Food Mixer"), "variation", BCON_UTF8("Deluxe"), "category", BCON_UTF8("KITCHENWARE"), "description", BCON_UTF8("Luxury mixer turning good cakes into great")); bson_error_t error; if (!mongoc_collection_insert_many(products, (const bson_t **)product_docs, num_docs, NULL, NULL, &error)) { fprintf(stderr, "Insert error: %s\n", error.message); } for (int i = 0; i < num_docs; i++) { bson_destroy(product_docs[i]); } } { size_t num_docs = 4; bson_t *order_docs[num_docs]; order_docs[0] = BCON_NEW( "customer_id", BCON_UTF8("[email protected]"), "orderdate", BCON_DATE_TIME(1590822952000UL), // 2020-05-30T08:35:52Z "product_name", BCON_UTF8("Asus Laptop"), "product_variation", BCON_UTF8("Standard Display"), "value", BCON_DOUBLE(431.43)); order_docs[1] = BCON_NEW( "customer_id", BCON_UTF8("[email protected]"), "orderdate", BCON_DATE_TIME(1559063612000UL), // 2019-05-28T19:13:32Z "product_name", BCON_UTF8("The Day Of The Triffids"), "product_variation", BCON_UTF8("2nd Edition"), "value", BCON_DOUBLE(5.01)); order_docs[2] = BCON_NEW( "customer_id", BCON_UTF8("[email protected]"), "orderdate", BCON_DATE_TIME(1577869537000UL), // 2020-01-01T08:25:37Z "product_name", BCON_UTF8("Morphy Richards Food Mixer"), "product_variation", BCON_UTF8("Deluxe"), "value", BCON_DOUBLE(63.13)); order_docs[3] = BCON_NEW( "customer_id", BCON_UTF8("[email protected]"), "orderdate", BCON_DATE_TIME(1608976546000UL), // 2020-12-26T08:55:46Z "product_name", BCON_UTF8("Asus Laptop"), "product_variation", BCON_UTF8("Standard Display"), "value", BCON_DOUBLE(429.65)); bson_error_t error; if (!mongoc_collection_insert_many(orders, (const bson_t **)order_docs, num_docs, NULL, NULL, &error)) { fprintf(stderr, "Insert error: %s\n", error.message); } for (int i = 0; i < num_docs; i++) { bson_destroy(order_docs[i]); } }
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo C++ . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o tutorial Introdução ao C++ .
Para saber mais sobre como usar o driver C++, consulte a documentação da API.
Para saber mais sobre como executar agregações no driver C++ , consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg-tutorial.cpp
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
using bsoncxx::builder::basic::kvp; using bsoncxx::builder::basic::make_document; using bsoncxx::builder::basic::make_array; int main() { mongocxx::instance instance; // Replace the placeholder with your connection string. mongocxx::uri uri("<connection string>"); mongocxx::client client(uri); auto db = client["agg_tutorials_db"]; // Delete existing data in the database, if necessary. db.drop(); // Get a reference to relevant collections. // ... auto some_coll = db["..."]; // ... auto another_coll = db["..."]; // Insert sample data into the collection or collections. // ... some_coll.insert_many(docs); // Create an empty pipelne. mongocxx::pipeline pipeline; // Add code to create pipeline stages. // pipeline.match(make_document(...)); // Run the aggregation and print the results. auto cursor = orders.aggregate(pipeline); for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc, bsoncxx::ExtendedJsonMode::k_relaxed) << std::endl; } }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma cadeia de conexão do tutorial de Introdução do C++ .
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
mongocxx::uri uri{"mongodb+srv://mongodb-example:27017"};
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
auto products = db["products"]; auto orders = db["orders"]; std::vector<bsoncxx::document::value> product_docs = { bsoncxx::from_json(R"({ "name": "Asus Laptop", "variation": "Ultra HD", "category": "ELECTRONICS", "description": "Great for watching movies" })"), bsoncxx::from_json(R"({ "name": "Asus Laptop", "variation": "Standard Display", "category": "ELECTRONICS", "description": "Good value laptop for students" })"), bsoncxx::from_json(R"({ "name": "The Day Of The Triffids", "variation": "1st Edition", "category": "BOOKS", "description": "Classic post-apocalyptic novel" })"), bsoncxx::from_json(R"({ "name": "The Day Of The Triffids", "variation": "2nd Edition", "category": "BOOKS", "description": "Classic post-apocalyptic novel" })"), bsoncxx::from_json(R"({ "name": "Morphy Richards Food Mixer", "variation": "Deluxe", "category": "KITCHENWARE", "description": "Luxury mixer turning good cakes into great" })") }; products.insert_many(product_docs); // Might throw an exception std::vector<bsoncxx::document::value> order_docs = { bsoncxx::from_json(R"({ "customer_id": "[email protected]", "orderdate": {"$date": 1590821752000}, "product_name": "Asus Laptop", "product_variation": "Standard Display", "value": 431.43 })"), bsoncxx::from_json(R"({ "customer_id": "[email protected]", "orderdate": {"$date": 1559062412000}, "product_name": "The Day Of The Triffids", "product_variation": "2nd Edition", "value": 5.01 })"), bsoncxx::from_json(R"({ "customer_id": "[email protected]", "orderdate": {"$date": 1577861137000}, "product_name": "Morphy Richards Food Mixer", "product_variation": "Deluxe", "value": 63.13 })"), bsoncxx::from_json(R"({ "customer_id": "[email protected]", "orderdate": {"$date": 1608972946000}, "product_name": "Asus Laptop", "product_variation": "Standard Display", "value": 429.65 })") }; orders.insert_many(order_docs); // Might throw an exception
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo C#/ .NET . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia de início rápido do driver C#/ .NET .
Para saber mais sobre como executar agregações no driver C#/ .NET , consulte o guia Agregação.
Depois de instalar o driver, cole o seguinte código no seu arquivo Program.cs
para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Driver; // Define data model classes. // ... public class MyClass { ... } // Replace the placeholder with your connection string. var uri = "<connection string>"; var client = new MongoClient(uri); var aggDB = client.GetDatabase("agg_tutorials_db"); // Get a reference to relevant collections. // ... var someColl = aggDB.GetCollection<MyClass>("someColl"); // ... var anotherColl = aggDB.GetCollection<MyClass>("anotherColl"); // Delete any existing documents in collections if needed. // ... someColl.DeleteMany(Builders<MyClass>.Filter.Empty); // Insert sample data into the collection or collections. // ... someColl.InsertMany(new List<MyClass> { ... }); // Add code to chain pipeline stages to the Aggregate() method. // ... var results = someColl.Aggregate().Match(...); // Print the aggregation results. foreach (var result in results.ToList()) { Console.WriteLine(result); }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Configurar um cluster de camada grátis no Atlas do guia de Início Rápido de C#.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
var uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos Name
e Variation
em documentos na collection products
, correspondentes aos campos ProductName
e ProductVariation
em documentos na collection orders
.
Primeiro, crie classes C# para modelar os dados nas collections products
e orders
:
public class Product { [ ] public ObjectId Id { get; set; } public string Name { get; set; } = ""; public string Variation { get; set; } = ""; public string Category { get; set; } = ""; public string Description { get; set; } = ""; } public class Order { [ ] public ObjectId Id { get; set; } public required string CustomerId { get; set; } public DateTime OrderDate { get; set; } public string ProductName { get; set; } = ""; public string ProductVariation { get; set; } = ""; public double Value { get; set; } }
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
var orders = aggDB.GetCollection<Order>("orders"); var products = aggDB.GetCollection<Product>("products"); products.InsertMany(new List<Product> { new Product { Name = "Asus Laptop", Variation = "Ultra HD", Category = "ELECTRONICS", Description = "Great for watching movies" }, new Product { Name = "Asus Laptop", Variation = "Standard Display", Category = "ELECTRONICS", Description = "Good value laptop for students" }, new Product { Name = "The Day Of The Triffids", Variation = "1st Edition", Category = "BOOKS", Description = "Classic post-apocalyptic novel" }, new Product { Name = "The Day Of The Triffids", Variation = "2nd Edition", Category = "BOOKS", Description = "Classic post-apocalyptic novel" }, new Product { Name = "Morphy Richards Food Mixer", Variation = "Deluxe", Category = "KITCHENWARE", Description = "Luxury mixer turning good cakes into great" } }); orders.InsertMany(new List<Order> { new Order { CustomerId = "[email protected]", OrderDate = DateTime.Parse("2020-05-30T08:35:52Z"), ProductName = "Asus Laptop", ProductVariation = "Standard Display", Value = 431.43 }, new Order { CustomerId = "[email protected]", OrderDate = DateTime.Parse("2019-05-28T19:13:32Z"), ProductName = "The Day Of The Triffids", ProductVariation = "2nd Edition", Value = 5.01 }, new Order { CustomerId = "[email protected]", OrderDate = DateTime.Parse("2020-01-01T08:25:37Z"), ProductName = "Morphy Richards Food Mixer", ProductVariation = "Deluxe", Value = 63.13 }, new Order { CustomerId = "[email protected]", OrderDate = DateTime.Parse("2020-12-26T08:55:46Z"), ProductName = "Asus Laptop", ProductVariation = "Standard Display", Value = 429.65 } });
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Go. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Início Rápido do Driver Go.
Para saber mais sobre como executar agregações no Go Driver, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg_tutorial.go
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) // Define structs. // type MyStruct struct { ... } func main() { // Replace the placeholder with your connection string. const uri = "<connection string>" client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { log.Fatal(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { log.Fatal(err) } }() aggDB := client.Database("agg_tutorials_db") // Get a reference to relevant collections. // ... someColl := aggDB.Collection("...") // ... anotherColl := aggDB.Collection("...") // Delete any existing documents in collections if needed. // ... someColl.DeleteMany(context.TODO(), bson.D{}) // Insert sample data into the collection or collections. // ... _, err = someColl.InsertMany(...) // Add code to create pipeline stages. // ... myStage := bson.D{{...}} // Create a pipeline that includes the stages. // ... pipeline := mongo.Pipeline{...} // Run the aggregation. // ... cursor, err := someColl.Aggregate(context.TODO(), pipeline) if err != nil { log.Fatal(err) } defer func() { if err := cursor.Close(context.TODO()); err != nil { log.Fatalf("failed to close cursor: %v", err) } }() // Decode the aggregation results. var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { log.Fatalf("failed to decode results: %v", err) } // Print the aggregation results. for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) } }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar um cluster MongoDB do guia Go Quick Start.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
const uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Primeiro, crie estruturas Go para modelar os dados nas collections products
e orders
:
type Product struct { Name string Variation string Category string Description string } type Order struct { CustomerID string `bson:"customer_id"` OrderDate bson.DateTime `bson:"orderdate"` ProductName string `bson:"product_name"` ProductVariation string `bson:"product_variation"` Value float32 `bson:"value"` }
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
products := aggDB.Collection("products") orders := aggDB.Collection("orders") products.DeleteMany(context.TODO(), bson.D{}) orders.DeleteMany(context.TODO(), bson.D{}) _, err = products.InsertMany(context.TODO(), []interface{}{ Product{ Name: "Asus Laptop", Variation: "Ultra HD", Category: "ELECTRONICS", Description: "Great for watching movies", }, Product{ Name: "Asus Laptop", Variation: "Standard Display", Category: "ELECTRONICS", Description: "Good value laptop for students", }, Product{ Name: "The Day Of The Triffids", Variation: "1st Edition", Category: "BOOKS", Description: "Classic post-apocalyptic novel", }, Product{ Name: "The Day Of The Triffids", Variation: "2nd Edition", Category: "BOOKS", Description: "Classic post-apocalyptic novel", }, Product{ Name: "Morphy Richards Food Mixer", Variation: "Deluxe", Category: "KITCHENWARE", Description: "Luxury mixer turning good cakes into great", }, }) if err != nil { log.Fatal(err) } _, err = orders.InsertMany(context.TODO(), []interface{}{ Order{ CustomerID: "[email protected]", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 5, 30, 8, 35, 52, 0, time.UTC)), ProductName: "Asus Laptop", ProductVariation: "Standard Display", Value: 431.43, }, Order{ CustomerID: "[email protected]", OrderDate: bson.NewDateTimeFromTime(time.Date(2019, 5, 28, 19, 13, 32, 0, time.UTC)), ProductName: "The Day Of The Triffids", ProductVariation: "2nd Edition", Value: 5.01, }, Order{ CustomerID: "[email protected]", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 1, 1, 8, 25, 37, 0, time.UTC)), ProductName: "Morphy Richards Food Mixer", ProductVariation: "Deluxe", Value: 63.13, }, Order{ CustomerID: "[email protected]", OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 12, 26, 8, 55, 46, 0, time.UTC)), ProductName: "Asus Laptop", ProductVariation: "Standard Display", Value: 429.65, }, }) if err != nil { log.Fatal(err) }
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo Java . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Introdução ao driver Java .
Para saber mais sobre como realizar agregações no Driver Java Sync, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado AggTutorial.java
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
package org.example; // Modify imports for each tutorial as needed. import com.mongodb.client.*; import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Field; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import org.bson.Document; import org.bson.conversions.Bson; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class AggTutorial { public static void main(String[] args) { // Replace the placeholder with your connection string. String uri = "<connection string>" try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase aggDB = mongoClient.getDatabase("agg_tutorials_db"); // Get a reference to relevant collections. // ... MongoCollection<Document> someColl = ... // ... MongoCollection<Document> anotherColl = ... // Insert sample data into the collection or collections. // ... someColl.insertMany(...); // Create an empty pipeline array. List<Bson> pipeline = new ArrayList<>(); // Add code to create pipeline stages. // ... pipeline.add(...); // Run the aggregation. // ... AggregateIterable<Document> aggregationResult = // someColl.aggregate(pipeline); // Print the aggregation results. for (Document document : aggregationResult) { System.out.println(document.toJson()); } } } }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia Início Rápido do Java Sync.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
String uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
MongoCollection<Document> products = aggDB.getCollection("products"); MongoCollection<Document> orders = aggDB.getCollection("orders"); products.deleteMany(Filters.empty()); orders.deleteMany(Filters.empty()); products.insertMany( Arrays.asList( new Document("name", "Asus Laptop") .append("variation", "Ultra HD") .append("category", "ELECTRONICS") .append("description", "Great for watching movies"), new Document("name", "Asus Laptop") .append("variation", "Standard Display") .append("category", "ELECTRONICS") .append("description", "Good value laptop for students"), new Document("name", "The Day Of The Triffids") .append("variation", "1st Edition") .append("category", "BOOKS") .append("description", "Classic post-apocalyptic novel"), new Document("name", "The Day Of The Triffids") .append("variation", "2nd Edition") .append("category", "BOOKS") .append("description", "Classic post-apocalyptic novel"), new Document("name", "Morphy Richards Food Mixer") .append("variation", "Deluxe") .append("category", "KITCHENWARE") .append("description", "Luxury mixer turning good cakes into great") ) ); orders.insertMany( Arrays.asList( new Document("customer_id", "[email protected]") .append("orderdate", LocalDateTime.parse("2020-05-30T08:35:52")) .append("product_name", "Asus Laptop") .append("product_variation", "Standard Display") .append("value", 431.43), new Document("customer_id", "[email protected]") .append("orderdate", LocalDateTime.parse("2019-05-28T19:13:32")) .append("product_name", "The Day Of The Triffids") .append("product_variation", "2nd Edition") .append("value", 5.01), new Document("customer_id", "[email protected]") .append("orderdate", LocalDateTime.parse("2020-01-01T08:25:37")) .append("product_name", "Morphy Richards Food Mixer") .append("product_variation", "Deluxe") .append("value", 63.13), new Document("customer_id", "[email protected]") .append("orderdate", LocalDateTime.parse("2020-12-26T08:55:46")) .append("product_name", "Asus Laptop") .append("product_variation", "Standard Display") .append("value", 429.65) ) );
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo Java . Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Introdução ao driver Java .
Para saber mais sobre como realizar agregações no Driver Java Sync, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado AggTutorial.java
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
package org.example; // Modify imports for each tutorial as needed. import com.mongodb.client.*; import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Field; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import org.bson.Document; import org.bson.conversions.Bson; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class AggTutorial { public static void main(String[] args) { // Replace the placeholder with your connection string. String uri = "<connection string>" try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase aggDB = mongoClient.getDatabase("agg_tutorials_db"); // Get a reference to relevant collections. // ... MongoCollection<Document> someColl = ... // ... MongoCollection<Document> anotherColl = ... // Insert sample data into the collection or collections. // ... someColl.insertMany(...); // Create an empty pipeline array. List<Bson> pipeline = new ArrayList<>(); // Add code to create pipeline stages. // ... pipeline.add(...); // Run the aggregation. // ... AggregateIterable<Document> aggregationResult = // someColl.aggregate(pipeline); // Print the aggregation results. for (Document document : aggregationResult) { System.out.println(document.toJson()); } } } }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia Início Rápido do Java Sync.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
String uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Primeiro, crie classes de dados Kotlin para modelar os dados nas coleções products
e orders
:
data class Product( val name: String, val variation: String, val category: String, val description: String ) data class Order( val customerID: String, val orderDate: LocalDateTime, val productName: String, val productVariation: String, val value: Double )
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
val products = aggDB.getCollection<Product>("products") val orders = aggDB.getCollection<Order>("orders") products.deleteMany(Filters.empty()); orders.deleteMany(Filters.empty()); products.insertMany( listOf( Product("Asus Laptop", "Ultra HD", "ELECTRONICS", "Great for watching movies"), Product("Asus Laptop", "Standard Display", "ELECTRONICS", "Good value laptop for students"), Product("The Day Of The Triffids", "1st Edition", "BOOKS", "Classic post-apocalyptic novel"), Product("The Day Of The Triffids", "2nd Edition", "BOOKS", "Classic post-apocalyptic novel"), Product( "Morphy Richards Food Mixer", "Deluxe", "KITCHENWARE", "Luxury mixer turning good cakes into great" ) ) ) orders.insertMany( listOf( Order( "[email protected]", LocalDateTime.parse("2020-05-30T08:35:52"), "Asus Laptop", "Standard Display", 431.43 ), Order( "[email protected]", LocalDateTime.parse("2019-05-28T19:13:32"), "The Day Of The Triffids", "2nd Edition", 5.01 ), Order( "[email protected]", LocalDateTime.parse("2020-01-01T08:25:37"), "Morphy Richards Food Mixer", "Deluxe", 63.13 ), Order( "[email protected]", LocalDateTime.parse("2020-12-26T08:55:46"), "Asus Laptop", "Standard Display", 429.65 ) ) )
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Node.js Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia de início rápido do driver do Node.js
Para saber mais sobre como realizar agregações no Driver Node.js , consulte o Guia de agregação.
Depois de instalar o driver, crie um arquivo para executar o modelo de tutorial. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
const { MongoClient } = require("mongodb"); // Replace the placeholder with your connection string. const uri = "<connection-string>"; const client = new MongoClient(uri); export async function runTemplateApp() { try { const aggDB = client.db('agg_tutorials_db'); // Get a reference to relevant collections. // ... const someColl = // ... const anotherColl = // Delete any existing documents in collections. // ... await someColl.deleteMany({}); // Insert sample data into the collection or collections. // ... const someData = [ ... ]; // ... await someColl.insertMany(someData); // Create an empty pipeline array. const pipeline = []; // Add code to create pipeline stages. // ... pipeline.push({ ... }) // Run the aggregation. // ... const aggregationResult = ... // Print the aggregation results. for await (const document of aggregationResult) { console.log(document); } } finally { await client.close(); } } run().catch(console.dir);
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia de Início Rápido do Node.js
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
const uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
const products = aggDB.collection('products'); const orders = aggDB.collection('orders'); await products.insertMany([ { name: 'Asus Laptop', variation: 'Ultra HD', category: 'ELECTRONICS', description: 'Great for watching movies', }, { name: 'Asus Laptop', variation: 'Standard Display', category: 'ELECTRONICS', description: 'Good value laptop for students', }, { name: 'The Day Of The Triffids', variation: '1st Edition', category: 'BOOKS', description: 'Classic post-apocalyptic novel', }, { name: 'The Day Of The Triffids', variation: '2nd Edition', category: 'BOOKS', description: 'Classic post-apocalyptic novel', }, { name: 'Morphy Richards Food Mixer', variation: 'Deluxe', category: 'KITCHENWARE', description: 'Luxury mixer turning good cakes into great', }, ]); await orders.insertMany([ { customer_id: '[email protected]', orderdate: new Date('2020-05-30T08:35:52Z'), product_name: 'Asus Laptop', product_variation: 'Standard Display', value: 431.43, }, { customer_id: '[email protected]', orderdate: new Date('2019-05-28T19:13:32Z'), product_name: 'The Day Of The Triffids', product_variation: '2nd Edition', value: 5.01, }, { customer_id: '[email protected]', orderdate: new Date('2020-01-01T08:25:37Z'), product_name: 'Morphy Richards Food Mixer', product_variation: 'Deluxe', value: 63.13, }, { customer_id: '[email protected]', orderdate: new Date('2020-12-26T08:55:46Z'), product_name: 'Asus Laptop', product_variation: 'Standard Display', value: 429.65, }, ]);
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Go. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Início Rápido do Driver Go.
Para saber mais sobre como executar agregações no Go Driver, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg_tutorial.go
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) // Define structs. // type MyStruct struct { ... } func main() { // Replace the placeholder with your connection string. const uri = "<connection string>" client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { log.Fatal(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { log.Fatal(err) } }() aggDB := client.Database("agg_tutorials_db") // Get a reference to relevant collections. // ... someColl := aggDB.Collection("...") // ... anotherColl := aggDB.Collection("...") // Delete any existing documents in collections if needed. // ... someColl.DeleteMany(context.TODO(), bson.D{}) // Insert sample data into the collection or collections. // ... _, err = someColl.InsertMany(...) // Add code to create pipeline stages. // ... myStage := bson.D{{...}} // Create a pipeline that includes the stages. // ... pipeline := mongo.Pipeline{...} // Run the aggregation. // ... cursor, err := someColl.Aggregate(context.TODO(), pipeline) if err != nil { log.Fatal(err) } defer func() { if err := cursor.Close(context.TODO()); err != nil { log.Fatalf("failed to close cursor: %v", err) } }() // Decode the aggregation results. var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { log.Fatalf("failed to decode results: %v", err) } // Print the aggregation results. for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) } }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar um cluster MongoDB do guia Go Quick Start.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
const uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
$products = $client->agg_tutorials_db->products; $orders = $client->agg_tutorials_db->orders; $products->deleteMany([]); $orders->deleteMany([]); $products->insertMany( [ [ 'name' => "Asus Laptop", 'variation' => "Ultra HD", 'category' => "ELECTRONICS", 'description' => "Great for watching movies" ], [ 'name' => "Asus Laptop", 'variation' => "Standard Display", 'category' => "ELECTRONICS", 'description' => "Good value laptop for students" ], [ 'name' => "The Day Of The Triffids", 'variation' => "1st Edition", 'category' => "BOOKS", 'description' => "Classic post-apocalyptic novel" ], [ 'name' => "The Day Of The Triffids", 'variation' => "2nd Edition", 'category' => "BOOKS", 'description' => "Classic post-apocalyptic novel" ], [ 'name' => "Morphy Richards Food Mixer", 'variation' => "Deluxe", 'category' => "KITCHENWARE", 'description' => "Luxury mixer turning good cakes into great" ] ] ); $orders->insertMany( [ [ 'customer_id' => "[email protected]", 'orderdate' => new UTCDateTime((new DateTimeImmutable("2020-05-30T08:35:52"))), 'product_name' => "Asus Laptop", 'product_variation' => "Standard Display", 'value' => 431.43 ], [ 'customer_id' => "[email protected]", 'orderdate' => new UTCDateTime((new DateTimeImmutable("2019-05-28T19:13:32"))), 'product_name' => "The Day Of The Triffids", 'product_variation' => "2nd Edition", 'value' => 5.01 ], [ 'customer_id' => "[email protected]", 'orderdate' => new UTCDateTime((new DateTimeImmutable("2020-01-01T08:25:37"))), 'product_name' => "Morphy Richards Food Mixer", 'product_variation' => "Deluxe", 'value' => 63.13 ], [ 'customer_id' => "[email protected]", 'orderdate' => new UTCDateTime((new DateTimeImmutable("2020-12-26T08:55:46"))), 'product_name' => "Asus Laptop", 'product_variation' => "Standard Display", 'value' => 429.65 ] ] );
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Python. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o PyMongo e se conectar ao MongoDB, consulte o tutorial Introdução ao PyMongo.
Para saber mais sobre como realizar agregações no PyMongo, consulte o Guia de agregação.
Depois de instalar a biblioteca, crie um arquivo chamado agg_tutorial.py
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
# Modify imports for each tutorial as needed. from pymongo import MongoClient # Replace the placeholder with your connection string. uri = "<connection-string>" client = MongoClient(uri) try: agg_db = client["agg_tutorials_db"] # Get a reference to relevant collections. # ... some_coll = agg_db["some_coll"] # ... another_coll = agg_db["another_coll"] # Delete any existing documents in collections if needed. # ... some_coll.delete_many({}) # Insert sample data into the collection or collections. # ... some_coll.insert_many(...) # Create an empty pipeline array. pipeline = [] # Add code to create pipeline stages. # ... pipeline.append({...}) # Run the aggregation. # ... aggregation_result = ... # Print the aggregation results. for document in aggregation_result: print(document) finally: client.close()
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão de seu sistema, consulte a etapa Criar uma connection string do tutorial de Introdução à biblioteca PHP.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
uri = "mongodb+srv://mongodb-example:27017"
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
products_coll = agg_db["products"] orders_coll = agg_db["orders"] order_data = [ { "customer_id": "[email protected]", "orderdate": datetime(2020, 5, 30, 8, 35, 52), "product_name": "Asus Laptop", "product_variation": "Standard Display", "value": 431.43, }, { "customer_id": "[email protected]", "orderdate": datetime(2019, 5, 28, 19, 13, 32), "product_name": "The Day Of The Triffids", "product_variation": "2nd Edition", "value": 5.01, }, { "customer_id": "[email protected]", "orderdate": datetime(2020, 1, 1, 8, 25, 37), "product_name": "Morphy Richards Food Mixer", "product_variation": "Deluxe", "value": 63.13, }, { "customer_id": "[email protected]", "orderdate": datetime(2020, 12, 26, 8, 55, 46), "product_name": "Asus Laptop", "product_variation": "Standard Display", "value": 429.65, }, ] orders_coll.insert_many(order_data) products_data = [ { "name": "Asus Laptop", "variation": "Ultra HD", "category": "ELECTRONICS", "description": "Great for watching movies", }, { "name": "Asus Laptop", "variation": "Standard Display", "category": "ELECTRONICS", "description": "Good value laptop for students", }, { "name": "The Day Of The Triffids", "variation": "1st Edition", "category": "BOOKS", "description": "Classic post-apocalyptic novel", }, { "name": "The Day Of The Triffids", "variation": "2nd Edition", "category": "BOOKS", "description": "Classic post-apocalyptic novel", }, { "name": "Morphy Richards Food Mixer", "variation": "Deluxe", "category": "KITCHENWARE", "description": "Luxury mixer turning good cakes into great", }, ] products_coll.insert_many(products_data)
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Ruby. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o Ruby Driver e se conectar ao MongoDB, consulte o guia Introdução ao Ruby Driver.
Para saber mais sobre como realizar agregações no Driver Ruby, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg_tutorial.rb
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
# typed: strict require 'mongo' require 'bson' # Replace the placeholder with your connection string. uri = "<connection string>" Mongo::Client.new(uri) do |client| agg_db = client.use('agg_tutorials_db') # Get a reference to relevant collections. # ... some_coll = agg_db[:some_coll] # Delete any existing documents in collections if needed. # ... some_coll.delete_many({}) # Insert sample data into the collection or collections. # ... some_coll.insert_many( ... ) # Add code to create pipeline stages within the array. # ... pipeline = [ ... ] # Run the aggregation. # ... aggregation_result = some_coll.aggregate(pipeline) # Print the aggregation results. aggregation_result.each do |doc| puts doc end end
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia de Introdução ao Ruby.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
uri = "mongodb+srv://mongodb-example:27017"
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
products = agg_db[:products] orders = agg_db[:orders] products.delete_many({}) orders.delete_many({}) products.insert_many( [ { name: "Asus Laptop", variation: "Ultra HD", category: "ELECTRONICS", description: "Great for watching movies", }, { name: "Asus Laptop", variation: "Standard Display", category: "ELECTRONICS", description: "Good value laptop for students", }, { name: "The Day Of The Triffids", variation: "1st Edition", category: "BOOKS", description: "Classic post-apocalyptic novel", }, { name: "The Day Of The Triffids", variation: "2nd Edition", category: "BOOKS", description: "Classic post-apocalyptic novel", }, { name: "Morphy Richards Food Mixer", variation: "Deluxe", category: "KITCHENWARE", description: "Luxury mixer turning good cakes into great", }, ] ) orders.insert_many( [ { customer_id: "[email protected]", orderdate: DateTime.parse("2020-05-30T08:35:52Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 431.43, }, { customer_id: "[email protected]", orderdate: DateTime.parse("2019-05-28T19:13:32Z"), product_name: "The Day Of The Triffids", product_variation: "2nd Edition", value: 5.01, }, { customer_id: "[email protected]", orderdate: DateTime.parse("2020-01-01T08:25:37Z"), product_name: "Morphy Richards Food Mixer", product_variation: "Deluxe", value: 63.13, }, { customer_id: "[email protected]", orderdate: DateTime.parse("2020-12-26T08:55:46Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 429.65, }, ] )
Criar o Aplicativo Modelo
Antes de começar a seguir este tutorial de agregação , você deve configurar um novo aplicativo Rust. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Início Rápido do Driver Rust.
Para saber mais sobre como realizar agregações no Driver Rust, consulte o guia Agregação.
Depois de instalar o driver, crie um arquivo chamado agg-tutorial.rs
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
use mongodb::{ bson::{doc, Document}, options::ClientOptions, Client, }; use futures::stream::TryStreamExt; use std::error::Error; // Define structs. // #[derive(Debug, Serialize, Deserialize)] // struct MyStruct { ... } async fn main() mongodb::error::Result<()> { // Replace the placeholder with your connection string. let uri = "<connection string>"; let client = Client::with_uri_str(uri).await?; let agg_db = client.database("agg_tutorials_db"); // Get a reference to relevant collections. // ... let some_coll: Collection<T> = agg_db.collection("..."); // ... let another_coll: Collection<T> = agg_db.collection("..."); // Delete any existing documents in collections if needed. // ... some_coll.delete_many(doc! {}).await?; // Insert sample data into the collection or collections. // ... some_coll.insert_many(vec![...]).await?; // Create an empty pipeline. let mut pipeline = Vec::new(); // Add code to create pipeline stages. // pipeline.push(doc! { ... }); // Run the aggregation and print the results. let mut results = some_coll.aggregate(pipeline).await?; while let Some(result) = results.try_next().await? { println!("{:?}\n", result); } Ok(()) }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia Rust Quick Start.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
let uri = "mongodb+srv://mongodb-example:27017";
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Primeiro, crie estruturas Rust para modelar os dados nas collections products
e orders
:
struct Product { name: String, variation: String, category: String, description: String, } struct Order { customer_id: String, order_date: DateTime, product_name: String, product_variation: String, value: f32, }
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
let products: Collection<Product> = agg_db.collection("products"); let orders: Collection<Order> = agg_db.collection("orders"); products.delete_many(doc! {}).await?; orders.delete_many(doc! {}).await?; let product_docs = vec![ Product { name: "Asus Laptop".to_string(), variation: "Ultra HD".to_string(), category: "ELECTRONICS".to_string(), description: "Great for watching movies".to_string(), }, Product { name: "Asus Laptop".to_string(), variation: "Standard Display".to_string(), category: "ELECTRONICS".to_string(), description: "Good value laptop for students".to_string(), }, Product { name: "The Day Of The Triffids".to_string(), variation: "1st Edition".to_string(), category: "BOOKS".to_string(), description: "Classic post-apocalyptic novel".to_string(), }, Product { name: "The Day Of The Triffids".to_string(), variation: "2nd Edition".to_string(), category: "BOOKS".to_string(), description: "Classic post-apocalyptic novel".to_string(), }, Product { name: "Morphy Richards Food Mixer".to_string(), variation: "Deluxe".to_string(), category: "KITCHENWARE".to_string(), description: "Luxury mixer turning good cakes into great".to_string(), }, ]; products.insert_many(product_docs).await?; let order_docs = vec![ Order { customer_id: "[email protected]".to_string(), order_date: DateTime::builder().year(2020).month(5).day(30).hour(8).minute(35).second(52).build().unwrap(), product_name: "Asus Laptop".to_string(), product_variation: "Standard Display".to_string(), value: 431.43, }, Order { customer_id: "[email protected]".to_string(), order_date: DateTime::builder().year(2019).month(5).day(28).hour(19).minute(13).second(32).build().unwrap(), product_name: "The Day Of The Triffids".to_string(), product_variation: "2nd Edition".to_string(), value: 5.01, }, Order { customer_id: "[email protected]".to_string(), order_date: DateTime::builder().year(2020).month(1).day(1).hour(8).minute(25).second(37).build().unwrap(), product_name: "Morphy Richards Food Mixer".to_string(), product_variation: "Deluxe".to_string(), value: 63.13, }, Order { customer_id: "[email protected]".to_string(), order_date: DateTime::builder().year(2020).month(12).day(26).hour(8).minute(55).second(46).build().unwrap(), product_name: "Asus Laptop".to_string(), product_variation: "Standard Display".to_string(), value: 429.65, }, ]; orders.insert_many(order_docs).await?;
Criar o Aplicativo Modelo
Antes de começar a seguir um tutorial de agregação , você deve configurar um novo aplicativo Scala. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB , inserir dados de amostra no MongoDB e executar o pipeline de agregação .
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte o guia Introdução ao driver Scala.
Para saber mais sobre como executar agregações no Driver Scala, consulte o Guia de agregação.
Depois de instalar o driver, crie um arquivo chamado AggTutorial.scala
. Cole o código abaixo neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação .
Importante
No código a seguir, leia os comentários do código para localizar as seções do código que você deve modificar para o tutorial que está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
package org.example; // Modify imports for each tutorial as needed. import org.mongodb.scala.MongoClient import org.mongodb.scala.bson.Document import org.mongodb.scala.model.{Accumulators, Aggregates, Field, Filters, Variable} import java.text.SimpleDateFormat object FilteredSubset { def main(args: Array[String]): Unit = { // Replace the placeholder with your connection string. val uri = "<connection string>" val mongoClient = MongoClient(uri) Thread.sleep(1000) val aggDB = mongoClient.getDatabase("agg_tutorials_db") // Get a reference to relevant collections. // ... val someColl = aggDB.getCollection("someColl") // ... val anotherColl = aggDB.getCollection("anotherColl") // Delete any existing documents in collections if needed. // ... someColl.deleteMany(Filters.empty()).subscribe(...) // If needed, create the date format template. val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") // Insert sample data into the collection or collections. // ... someColl.insertMany(...).subscribe(...) Thread.sleep(1000) // Add code to create pipeline stages within the Seq. // ... val pipeline = Seq(...) // Run the aggregation and print the results. // ... someColl.aggregate(pipeline).subscribe(...) Thread.sleep(1000) mongoClient.close() } }
Para cada tutorial, você deve substituir o placeholder da string de conexão pela string de conexão da sua implantação.
Dica
Para saber como localizar a string de conexão do seu sistema, consulte a etapa Criar uma connection string do guia de Introdução do driver Scala.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
val uri = "mongodb+srv://mongodb-example:27017"
Criar a coleção
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto. A agregação usa uma união de vários campos para combinar um documento de produto com documentos que representam pedidos desse produto. A agregação une collections pelos campos name
e variation
em documentos na collection products
, correspondentes aos campos product_name
e product_variation
em documentos na collection orders
.
Para criar as coleções products
e orders
e inserir os dados de amostra, adicione o seguinte código ao seu aplicação:
val products = aggDB.getCollection("products") val orders = aggDB.getCollection("orders") products.deleteMany(Filters.empty()).subscribe( _ => {}, e => println("Error: " + e.getMessage), ) orders.deleteMany(Filters.empty()).subscribe( _ => {}, e => println("Error: " + e.getMessage), ) val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") products.insertMany( Seq( Document( "name" -> "Asus Laptop", "variation" -> "Ultra HD", "category" -> "ELECTRONICS", "description" -> "Great for watching movies" ), Document( "name" -> "Asus Laptop", "variation" -> "Standard Display", "category" -> "ELECTRONICS", "description" -> "Good value laptop for students" ), Document( "name" -> "The Day Of The Triffids", "variation" -> "1st Edition", "category" -> "BOOKS", "description" -> "Classic post-apocalyptic novel" ), Document( "name" -> "The Day Of The Triffids", "variation" -> "2nd Edition", "category" -> "BOOKS", "description" -> "Classic post-apocalyptic novel" ), Document( "name" -> "Morphy Richards Food Mixer", "variation" -> "Deluxe", "category" -> "KITCHENWARE", "description" -> "Luxury mixer turning good cakes into great" ) ) ).subscribe( _ => {}, e => println("Error: " + e.getMessage), ) orders.insertMany( Seq( Document( "customer_id" -> "[email protected]", "orderdate" -> dateFormat.parse("2020-05-30T08:35:52"), "product_name" -> "Asus Laptop", "product_variation" -> "Standard Display", "value" -> 431.43 ), Document( "customer_id" -> "[email protected]", "orderdate" -> dateFormat.parse("2019-05-28T19:13:32"), "product_name" -> "The Day Of The Triffids", "product_variation" -> "2nd Edition", "value" -> 5.01 ), Document( "customer_id" -> "[email protected]", "orderdate" -> dateFormat.parse("2020-01-01T08:25:37"), "product_name" -> "Morphy Richards Food Mixer", "product_variation" -> "Deluxe", "value" -> 63.13 ), Document( "customer_id" -> "[email protected]", "orderdate" -> dateFormat.parse("2020-12-26T08:55:46"), "product_name" -> "Asus Laptop", "product_variation" -> "Standard Display", "value" -> 429.65 ) ) ).subscribe( _ => {}, e => println("Error: " + e.getMessage), )
Passos
As etapas a seguir demonstram como criar e executar um pipeline de agregação para unir coleções em vários campos.
Crie um pipeline incorporado para usar no estágio de pesquisa.
O primeiro estágio do pipeline é um estágio $lookup
para unir a coleção orders
à coleção products
por dois campos em cada coleção. O estágio $lookup
contém um pipeline incorporado para configurar a união.
embedded_pl = [ // Stage 1: Match the values of two fields on each side of the join // The $eq filter uses aliases for the name and variation fields set { $match: { $expr: { $and: [ { $eq: ["$product_name", "$$prdname"] }, { $eq: ["$product_variation", "$$prdvartn"] } ] } } }, // Stage 2: Match orders placed in 2020 { $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z") } } }, // Stage 3: Remove unneeded fields from the orders collection side of the join { $unset: ["_id", "product_name", "product_variation"] } ]
Execute o agregação pipeline.
db.products.aggregate( [ // Use the embedded pipeline in a lookup stage { $lookup: { from: "orders", let: { prdname: "$name", prdvartn: "$variation" }, pipeline: embedded_pl, as: "orders" } }, // Match products ordered in 2020 { $match: { orders: { $ne: [] } } }, // Remove unneeded fields { $unset: ["_id", "description"] } ] )
Interprete os resultados da agregação .
Os resultados agregados contêm dois documentos. Os documentos representam produtos pedidos 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido desse produto.
{ name: 'Asus Laptop', variation: 'Standard Display', category: 'ELECTRONICS', orders: [ { customer_id: '[email protected]', orderdate: ISODate('2020-05-30T08:35:52.000Z'), value: 431.43 }, { customer_id: '[email protected]', orderdate: ISODate('2020-12-26T08:55:46.000Z'), value: 429.65 } ] } { name: 'Morphy Richards Food Mixer', variation: 'Deluxe', category: 'KITCHENWARE', orders: [ { customer_id: '[email protected]', orderdate: ISODate('2020-01-01T08:25:37.000Z'), value: 63.13 } ] }
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Crie o pipeline incorporado e adicione um $match
estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para os campos name
e variation
definidos ao criar o estágio $lookup:
bson_t embedded_pipeline; bson_array_builder_t *bab = bson_array_builder_new(); bson_array_builder_append_document(bab, BCON_NEW( "$match", "{", "$expr", "{", "$and", "[", "{", "$eq", "[", BCON_UTF8("$product_name"), BCON_UTF8("$$prdname"), "]", "}", "{", "$eq", "[", BCON_UTF8("$product_variation"), BCON_UTF8("$$prdvartn"), "]", "}", "]", "}", "}"));
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
bson_array_builder_append_document(bab, BCON_NEW( "$match", "{", "orderdate", "{", "$gte", BCON_DATE_TIME(1577836800000UL), "$lt", BCON_DATE_TIME(1609459200000UL), "}", "}"));
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
bson_array_builder_append_document(bab, BCON_NEW( "$unset", "[", BCON_UTF8("_id"), BCON_UTF8("product_name"), BCON_UTF8("product_variation"), "]")); // Builds the embedded pipeline array and cleans up resources bson_array_builder_build(bab, &embedded_pipeline); bson_array_builder_destroy(bab);
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
"{", "$lookup", "{", "from", BCON_UTF8("orders"), "let", "{", "prdname", BCON_UTF8("$name"), "prdvartn", BCON_UTF8("$variation"), "}", "pipeline", BCON_ARRAY(&embedded_pipeline), "as", BCON_UTF8("orders"), "}", "}",
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
"{", "$match", "{", "orders", "{", "$ne", "[", "]", "}", "}", "}",
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
"{", "$unset", "[", BCON_UTF8("_id"), BCON_UTF8("description"), "]", "}",
Execute o agregação pipeline.
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection products
:
mongoc_cursor_t *results = mongoc_collection_aggregate(products, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy(&embedded_pipeline); bson_destroy(pipeline);
Certifique-se de limpar os recursos de coleta adicionando a seguinte linha às declarações de limpeza:
mongoc_collection_destroy(products); mongoc_collection_destroy(orders);
Por fim, execute os seguintes comandos em seu shell para gerar e executar o executável:
gcc -o aggc agg-tutorial.c $(pkg-config --libs --cflags libmongoc-1.0) ./aggc
Dica
Se você encontrar erros de conexão ao executar os comandos anteriores em uma chamada, poderá executá-los separadamente.
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{ "name" : "Asus Laptop", "variation" : "Standard Display", "category" : "ELECTRONICS", "orders" : [ { "customer_id" : "[email protected]", "orderdate" : { "$date" : { "$numberLong" : "1590822952000" } }, "value" : { "$numberDouble" : "431.43000000000000682" } }, { "customer_id" : "[email protected]", "orderdate" : { "$date" : { "$numberLong" : "1608976546000" } }, "value" : { "$numberDouble" : "429.64999999999997726" } } ] } { "name" : "Morphy Richards Food Mixer", "variation" : "Deluxe", "category" : "KITCHENWARE", "orders" : [ { "customer_id" : "[email protected]", "orderdate" : { "$date" : { "$numberLong" : "1577869537000" } }, "value" : { "$numberDouble" : "63.130000000000002558" } } ] }
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
auto embed_match_stage1 = bsoncxx::from_json(R"({ "$match": { "$expr": { "$and": [ { "$eq": ["$product_name", "$$prdname"] }, { "$eq": ["$product_variation", "$$prdvartn"] } ] } } })");
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
auto embed_match_stage2 = bsoncxx::from_json(R"({ "$match": { "orderdate": { "$gte": { "$date": 1577836800000 }, "$lt": { "$date": 1609459200000 } } } })");
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
auto embed_unset_stage = bsoncxx::from_json(R"({ "$unset": ["_id", "product_name", "product_variation"] })");
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
pipeline.lookup(make_document( kvp("from", "orders"), kvp("let", make_document( kvp("prdname", "$name"), kvp("prdvartn", "$variation") )), kvp("pipeline", make_array(embed_match_stage1, embed_match_stage2, embed_unset_stage)), kvp("as", "orders") ));
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
pipeline.match(bsoncxx::from_json(R"({ "orders": { "$ne": [] } })"));
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
pipeline.append_stage(bsoncxx::from_json(R"({ "$unset": ["_id", "description"] })"));
Execute o agregação pipeline.
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection products
:
auto cursor = products.aggregate(pipeline);
Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:
c++ --std=c++17 agg-tutorial.cpp $(pkg-config --cflags --libs libmongocxx) -o ./app.out ./app.out
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{ "name" : "Asus Laptop", "variation" : "Standard Display", "category" : "ELECTRONICS", "orders" : [ { "customer_id" : "[email protected]", "orderdate" : { "$date" : "2020-05-30T06:55:52Z" }, "value" : 431.43000000000000682 }, { "customer_id" : "[email protected]", "orderdate" : { "$date" : "2020-12-26T08:55:46Z" }, "value" : 429.64999999999997726 } ] } { "name" : "Morphy Richards Food Mixer", "variation" : "Deluxe", "category" : "KITCHENWARE", "orders" : [ { "customer_id" : "[email protected]", "orderdate" : { "$date" : "2020-01-01T06:45:37Z" }, "value" : 63.130000000000002558 } ] }
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Instancie o pipeline incorporado e, em seguida, encadeie um $match
estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para os campos Name
e definidos Variation
ao criar o estágio $lookup:
var embeddedPipeline = new EmptyPipelineDefinition<Order>() .Match(new BsonDocument("$expr", new BsonDocument("$and", new BsonArray { new BsonDocument("$eq", new BsonArray { "$ProductName", "$$prdname" }), new BsonDocument("$eq", new BsonArray { "$ProductVariation", "$$prdvartn" }) })))
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
.Match(o => o.OrderDate >= DateTime.Parse("2020-01-01T00:00:00Z") && o.OrderDate < DateTime.Parse("2021-01-01T00:00:00Z"))
No pipeline incorporado, adicione um estágio para remover campos desnecessários $project
do orders
lado da coleção da união:
.Project(Builders<Order>.Projection .Exclude(o => o.Id) .Exclude(o => o.ProductName) .Exclude(o => o.ProductVariation));
Depois que o pipeline incorporado for concluído, inicie a agregação principal na coleção products
e encadeie o estágio $lookup
. Configure este estágio para armazenar os campos de pesquisa processados em um campo de array denominado Orders
:
var results = products.Aggregate() .Lookup<Order, BsonDocument, IEnumerable<BsonDocument>, BsonDocument>( foreignCollection: orders, let: new BsonDocument { { "prdname", "$Name" }, { "prdvartn", "$Variation" } }, lookupPipeline: embeddedPipeline, "Orders" )
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na Orders
array criada na etapa anterior:
.Match(Builders<BsonDocument>.Filter.Ne("Orders", new BsonArray()))
Adicione um estágio de projeção para remover campos desnecessários.
Finalmente, adicione um estágio $project
. O estágio $project
remove os campos _id
e Description
dos documentos de resultado:
.Project(Builders<BsonDocument>.Projection .Exclude("_id") .Exclude("Description") );
Execute a agregação e interprete os resultados.
Por fim, execute o aplicação em seu IDE e inspecione os resultados.
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array Orders
que lista detalhes sobre cada pedido para esse produto:
{ "Name" : "Asus Laptop", "Variation" : "Standard Display", "Category" : "ELECTRONICS", "Orders" : [{ "CustomerId" : "[email protected]", "OrderDate" : { "$date" : "2020-05-30T08:35:52Z" }, "Value" : 431.43000000000001 }, { "CustomerId" : "[email protected]", "OrderDate" : { "$date" : "2020-12-26T08:55:46Z" }, "Value" : 429.64999999999998 }] } { "Name" : "Morphy Richards Food Mixer", "Variation" : "Deluxe", "Category" : "KITCHENWARE", "Orders" : [{ "CustomerId" : "[email protected]", "OrderDate" : { "$date" : "2020-01-01T08:25:37Z" }, "Value" : 63.130000000000003 }] }
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
embeddedMatchStage1 := bson.D{ {Key: "$match", Value: bson.D{ {Key: "$expr", Value: bson.D{ {Key: "$and", Value: bson.A{ bson.D{{Key: "$eq", Value: bson.A{"$product_name", "$$prdname"}}}, bson.D{{Key: "$eq", Value: bson.A{"$product_variation", "$$prdvartn"}}}, }}, }}, }}, }
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
embeddedMatchStage2 := 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)}, }}, }}, }
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
embeddedUnsetStage := bson.D{ {Key: "$unset", Value: bson.A{"_id", "product_name", "product_variation"}}, }
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
embeddedPipeline := mongo.Pipeline{embeddedMatchStage1, embeddedMatchStage2, embeddedUnsetStage} lookupStage := bson.D{ {Key: "$lookup", Value: bson.D{ {Key: "from", Value: "orders"}, {Key: "let", Value: bson.D{ {Key: "prdname", Value: "$name"}, {Key: "prdvartn", Value: "$variation"}, }}, {Key: "pipeline", Value: embeddedPipeline}, {Key: "as", Value: "orders"}, }}, }
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
matchStage := bson.D{ {Key: "$match", Value: bson.D{ {Key: "orders", Value: bson.D{{Key: "$ne", Value: bson.A{}}}}, }}, }
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
unsetStage := bson.D{ {Key: "$unset", Value: bson.A{"_id", "description"}}, }
Execute o agregação pipeline.
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection products
:
pipeline := mongo.Pipeline{lookupStage, matchStage, unsetStage} cursor, err := products.Aggregate(context.TODO(), pipeline)
Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:
go run agg_tutorial.go
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{"name":"Asus Laptop","variation":"Standard Display","category":"ELECTRONICS","orders":[{"customer_id":"[email protected]","orderdate":{"$date":"2020-05-30T08:35:52Z"},"value":431.42999267578125},{"customer_id":"[email protected]","orderdate":{"$date":"2020-12-26T08:55:46Z"},"value":429.6499938964844}]} {"name":"Morphy Richards Food Mixer","variation":"Deluxe","category":"KITCHENWARE","orders":[{"customer_id":"[email protected]","orderdate":{"$date":"2020-01-01T08:25:37Z"},"value":63.130001068115234}]}
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
List<Bson> embeddedPipeline = new ArrayList<>(); embeddedPipeline.add(Aggregates.match( Filters.expr( Filters.and( new Document("$eq", Arrays.asList("$product_name", "$$prdname")), new Document("$eq", Arrays.asList("$product_variation", "$$prdvartn")) ) ) ));
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
embeddedPipeline.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")) )));
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
embeddedPipeline.add(Aggregates.unset("_id", "product_name", "product_variation"));
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
pipeline.add(Aggregates.lookup( "orders", Arrays.asList( new Variable<>("prdname", "$name"), new Variable<>("prdvartn", "$variation") ), embeddedPipeline, "orders" ));
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
pipeline.add(Aggregates.match( Filters.ne("orders", new ArrayList<>()) ));
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
pipeline.add(Aggregates.unset("_id", "description"));
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{"name": "Asus Laptop", "variation": "Standard Display", "category": "ELECTRONICS", "orders": [{"customer_id": "[email protected]", "orderdate": {"$date": "2020-05-30T08:35:52Z"}, "value": 431.43}, {"customer_id": "[email protected]", "orderdate": {"$date": "2020-12-26T08:55:46Z"}, "value": 429.65}]} {"name": "Morphy Richards Food Mixer", "variation": "Deluxe", "category": "KITCHENWARE", "orders": [{"customer_id": "[email protected]", "orderdate": {"$date": "2020-01-01T08:25:37Z"}, "value": 63.13}]}
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
val embeddedPipeline = mutableListOf<Bson>() embeddedPipeline.add( Aggregates.match( Filters.expr( Document( "\$and", listOf( Document("\$eq", listOf("\$${Order::productName.name}", "$\$prdname")), Document("\$eq", listOf("\$${Order::productVariation.name}", "$\$prdvartn")) ) ) ) ) )
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
embeddedPipeline.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()) ) ) )
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
embeddedPipeline.add(Aggregates.unset("_id", Order::productName.name, Order::productVariation.name))
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
pipeline.add( Aggregates.lookup( "orders", listOf( Variable("prdname", "\$${Product::name.name}"), Variable("prdvartn", "\$${Product::variation.name}") ), embeddedPipeline, "orders" ) )
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
pipeline.add( Aggregates.match( Filters.ne("orders", mutableListOf<Document>()) ) )
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
pipeline.add(Aggregates.unset("_id", "description"))
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
Document{{name=Asus Laptop, variation=Standard Display, category=ELECTRONICS, orders=[Document{{[email protected], orderDate=Sat May 30 04:35:52 EDT 2020, value=431.43}}, Document{{[email protected], orderDate=Sat Dec 26 03:55:46 EST 2020, value=429.65}}]}} Document{{name=Morphy Richards Food Mixer, variation=Deluxe, category=KITCHENWARE, orders=[Document{{[email protected], orderDate=Wed Jan 01 03:25:37 EST 2020, value=63.13}}]}}
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
const embedded_pl = []; embedded_pl.push({ $match: { $expr: { $and: [ { $eq: ['$product_name', '$$prdname'] }, { $eq: ['$product_variation', '$$prdvartn'] }, ], }, }, });
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
embedded_pl.push({ $match: { orderdate: { $gte: new Date('2020-01-01T00:00:00Z'), $lt: new Date('2021-01-01T00:00:00Z'), }, }, });
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
embedded_pl.push({ $unset: ['_id', 'product_name', 'product_variation'], });
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
pipeline.push({ $lookup: { from: 'orders', let: { prdname: '$name', prdvartn: '$variation', }, pipeline: embedded_pl, as: 'orders', }, });
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
pipeline.push({ $match: { orders: { $ne: [] }, }, });
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
pipeline.push({ $unset: ['_id', 'description'], });
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{ name: 'Asus Laptop', variation: 'Standard Display', category: 'ELECTRONICS', orders: [ { customer_id: '[email protected]', orderdate: 2020-05-30T08:35:52.000Z, value: 431.43 }, { customer_id: '[email protected]', orderdate: 2020-12-26T08:55:46.000Z, value: 429.65 } ] } { name: 'Morphy Richards Food Mixer', variation: 'Deluxe', category: 'KITCHENWARE', orders: [ { customer_id: '[email protected]', orderdate: 2020-01-01T08:25:37.000Z, value: 63.13 } ] }
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio $lookup
para unir a coleção orders
à coleção products
por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união. Primeiro, crie o pipeline incorporado:
$embeddedPipeline = new Pipeline( // Add stages within embedded pipeline. };
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
Stage::match( Query::expr( Expression::and( Expression::eq( Expression::stringFieldPath('product_name'), Expression::variable('prdname') ), Expression::eq( Expression::stringFieldPath('product_variation'), Expression::variable('prdvartn') ), ) ) ),
No pipeline incorporado, adicione outro $match
estágio para corresponder 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'))), ] ),
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
Stage::unset('_id', 'product_name', 'product_variation')
Em seguida, fora de suas instâncias do Pipeline
, crie o estágio do $lookup
em uma função de fábrica. Configure este estágio para armazenar os campos de pesquisa processados em um campo de array denominado orders
:
function lookupOrdersStage(Pipeline $embeddedPipeline) { return Stage::lookup( from: 'orders', let: object( prdname: Expression::stringFieldPath('name'), prdvartn: Expression::stringFieldPath('variation'), ), pipeline: $embeddedPipeline, as: 'orders', ); }
Em seguida, na sua instância Pipeline
principal, chame a função lookupOrdersStage()
:
lookupOrdersStage($embeddedPipeline),
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
Stage::match( orders: Query::ne([]) ),
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
Stage::unset('_id', 'description')
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{ "name": "Asus Laptop", "variation": "Standard Display", "category": "ELECTRONICS", "orders": [ { "customer_id": "[email protected]", "orderdate": { "$date": { "$numberLong": "1590827752000" } }, "value": 431.43 }, { "customer_id": "[email protected]", "orderdate": { "$date": { "$numberLong": "1608972946000" } }, "value": 429.65 } ] } { "name": "Morphy Richards Food Mixer", "variation": "Deluxe", "category": "KITCHENWARE", "orders": [ { "customer_id": "[email protected]", "orderdate": { "$date": { "$numberLong": "1577867137000" } }, "value": 63.13 } ] }
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
embedded_pl = [ { "$match": { "$expr": { "$and": [ {"$eq": ["$product_name", "$$prdname"]}, {"$eq": ["$product_variation", "$$prdvartn"]}, ] } } } ]
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
embedded_pl.append( { "$match": { "orderdate": { "$gte": datetime(2020, 1, 1, 0, 0, 0), "$lt": datetime(2021, 1, 1, 0, 0, 0), } } } )
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
embedded_pl.append({"$unset": ["_id", "product_name", "product_variation"]})
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
pipeline.append( { "$lookup": { "from": "orders", "let": {"prdname": "$name", "prdvartn": "$variation"}, "pipeline": embedded_pl, "as": "orders", } } )
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
pipeline.append({"$match": {"orders": {"$ne": []}}})
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
pipeline.append({"$unset": ["_id", "description"]})
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{'name': 'Asus Laptop', 'variation': 'Standard Display', 'category': 'ELECTRONICS', 'orders': [{'customer_id': '[email protected]', 'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52), 'value': 431.43}, {'customer_id': '[email protected]', 'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46), 'value': 429.65}]} {'name': 'Morphy Richards Food Mixer', 'variation': 'Deluxe', 'category': 'KITCHENWARE', 'orders': [{'customer_id': '[email protected]', 'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37), 'value': 63.13}]}
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
{ "$match": { "$expr": { "$and": [ { "$eq": ["$product_name", "$$prdname"] }, { "$eq": ["$product_variation", "$$prdvartn"] }, ], }, }, },
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
{ "$match": { orderdate: { "$gte": DateTime.parse("2020-01-01T00:00:00Z"), "$lt": DateTime.parse("2021-01-01T00:00:00Z"), }, }, },
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
{ "$unset": ["_id", "product_name", "product_variation"], },
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
{ "$lookup": { from: "orders", let: { prdname: "$name", prdvartn: "$variation", }, pipeline: embedded_pipeline, as: "orders", }, },
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
{ "$match": { orders: { "$ne": [] }, }, },
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
{ "$unset": ["_id", "description"], },
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{"name"=>"Asus Laptop", "variation"=>"Standard Display", "category"=>"ELECTRONICS", "orders"=>[{"customer_id"=>"[email protected]", "orderdate"=>2020-05-30 08:35:52 UTC, "value"=>431.43}, {"customer_id"=>"[email protected]", "orderdate"=>2020-12-26 08:55:46 UTC, "value"=>429.65}]} {"name"=>"Morphy Richards Food Mixer", "variation"=>"Deluxe", "category"=>"KITCHENWARE", "orders"=>[{"customer_id"=>"[email protected]", "orderdate"=>2020-01-01 08:25:37 UTC, "value"=>63.13}]}
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
let mut embedded_pipeline = Vec::new(); embedded_pipeline.push(doc! { "$match": { "$expr": { "$and": [ { "$eq": ["$product_name", "$$prdname"] }, { "$eq": ["$product_variation", "$$prdvartn"] } ] } } });
No pipeline incorporado, adicione outro $match
estágio para corresponder aos pedidos feitos em 2020:
embedded_pipeline.push(doc! { "$match": { "order_date": { "$gte": DateTime::builder().year(2020).month(1).day(1).build().unwrap(), "$lt": DateTime::builder().year(2021).month(1).day(1).build().unwrap() } } });
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
embedded_pipeline.push(doc! { "$unset": ["_id", "product_name", "product_variation"] });
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
pipeline.push(doc! { "$lookup": { "from": "orders", "let": { "prdname": "$name", "prdvartn": "$variation" }, "pipeline": embedded_pipeline, "as": "orders" } });
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
pipeline.push(doc! { "$match": { "orders": { "$ne": [] } } });
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
pipeline.push(doc! { "$unset": ["_id", "description"] });
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
Document({"name": String("Asus Laptop"), "variation": String("Standard Display"), "category": String("ELECTRONICS"), "orders": Array([Document({"customer_id": String("[email protected]"), "order_date": DateTime(2020-05-30 8:35:52.0 +00:00:00), "value": Double(431.42999267578125)}), Document({"customer_id": String("[email protected]"), "order_date": DateTime(2020-12-26 8:55:46.0 +00:00:00), "value": Double(429.6499938964844)})])}) Document({"name": String("Morphy Richards Food Mixer"), "variation": String("Deluxe"), "category": String("KITCHENWARE"), "orders": Array([Document({"customer_id": String("[email protected]"), "order_date": DateTime(2020-01-01 8:25:37.0 +00:00:00), "value": Double(63.130001068115234)})])})
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Adicione um estágio de pesquisa para vincular as coleções e importar campos.
O primeiro estágio do pipeline é um estágio para unir $lookup
a orders
coleção à products
coleção por dois campos em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a união.
Dentro do pipeline incorporado, adicione um estágio para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para $match
os name
campos e variation
definidos ao criar o estágio $lookup:
Aggregates.filter( Filters.expr( Filters.and( Document("$eq" -> Seq("$product_name", "$$prdname")), Document("$eq" -> Seq("$product_variation", "$$prdvartn")) ) ) ),
No pipeline incorporado, adicione outro $match
estágio para corresponder 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")) ) ),
No pipeline incorporado, adicione um estágio para remover campos desnecessários $unset
do orders
lado da coleção da união:
Aggregates.unset("_id", "product_name", "product_variation"),
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
Aggregates.lookup( "orders", Seq( Variable("prdname", "$name"), Variable("prdvartn", "$variation"), ), embeddedPipeline, "orders" ),
Adicione um estágio de correspondência para os produtos pedidos em 2020.
Em seguida, adicione um estágio para mostrar apenas produtos para os quais há pelo menos um $match
pedido 2020 em, com base na orders
array calculada na etapa anterior:
Aggregates.filter(Filters.ne("orders", Seq())),
Adicione um estágio de desconfiguração para remover campos desnecessários.
Finalmente, adicione um estágio.$unset
O $unset
estágio remove _id
description
os campos e dos documentos de resultado:
Aggregates.unset("_id", "description")
Execute o agregação pipeline.
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection products
:
products.aggregate(pipeline) .subscribe( (doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"Error: $e"), )
Por fim, execute o aplicação em seu IDE.
Interprete os resultados da agregação .
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{"name": "Asus Laptop", "variation": "Standard Display", "category": "ELECTRONICS", "orders": [{"customer_id": "[email protected]", "orderdate": {"$date": "2020-05-30T12:35:52Z"}, "value": 431.43}, {"customer_id": "[email protected]", "orderdate": {"$date": "2020-12-26T13:55:46Z"}, "value": 429.65}]} {"name": "Morphy Richards Food Mixer", "variation": "Deluxe", "category": "KITCHENWARE", "orders": [{"customer_id": "[email protected]", "orderdate": {"$date": "2020-01-01T13:25:37Z"}, "value": 63.13}]}
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.