Docs Menu
Docs Home
/
데이터베이스 매뉴얼
/ / /

일대일 조인 수행

이 튜토리얼에서는 집계 파이프라인 구성하고, 컬렉션 에서 집계 수행하고, 선택한 언어 사용하여 결과를 표시하는 방법을 보여 줍니다.

이 튜토리얼에서는 제품 정보를 설명하는 컬렉션 의 데이터를 고객 주문을 설명하는 다른 컬렉션 과 결합하는 방법을 보여 줍니다. 결과에는 2020 에서 이루어진 모든 주문 목록이 표시되며 각 주문과 관련된 제품 세부 정보가 포함됩니다.

이 애그리게이션은 일대일 조인을 수행합니다. 일대일 조인은 한 컬렉션의 문서에 동일한 필드 값을 가진 다른 컬렉션의 단일 문서와 일치하는 필드 값이 있을 때 발생합니다. 애그리게이션은 이러한 문서를 필드 값과 일치시키고 두 소스의 정보를 하나의 결과로 결합합니다.

참고

일대일 조인에서는 문서가 일대일 관계 가질 필요가 없습니다. 이 데이터 관계에 대해 자세히 학습하려면 일대일(데이터 모델)에 대한 Wikipedia 항목을 참조하세요.


➤ 오른쪽 상단의 언어 선택 드롭다운 메뉴를 사용하여 다음 예제의 언어 설정하다 하거나 MongoDB Shell 선택합니다.


이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들려면 insertMany() 메서드를 사용합니다.

db.orders.deleteMany({})
db.orders.insertMany( [
{
customer_id: "elise_smith@myemail.com",
orderdate: new Date("2020-05-30T08:35:52Z"),
product_id: "a1b2c3d4",
value: 431.43
},
{
customer_id: "tj@wheresmyemail.com",
orderdate: new Date("2019-05-28T19:13:32Z"),
product_id: "z9y8x7w6",
value: 5.01
},
{
customer_id: "oranieri@warmmail.com",
orderdate: new Date("2020-01-01T08:25:37Z"),
product_id: "ff11gg22hh33",
value: 63.13
},
{
customer_id: "jjones@tepidmail.com",
orderdate: new Date("2020-12-26T08:55:46Z"),
product_id: "a1b2c3d4",
value: 429.65
}
] )
db.products.deleteMany({})
db.products.insertMany( [
{
p_id: "a1b2c3d4",
name: "Asus Laptop",
category: "ELECTRONICS",
description: "Good value laptop for students"
},
{
p_id: "z9y8x7w6",
name: "The Day Of The Triffids",
category: "BOOKS",
description: "Classic post-apocalyptic novel"
},
{
p_id: "ff11gg22hh33",
name: "Morphy Richardds Food Mixer",
category: "KITCHENWARE",
description: "Luxury mixer turning good cakes into great"
},
{
p_id: "pqr678st",
name: "Karcher Hose Set",
category: "GARDEN",
description: "Hose + nosels + winder for tidy storage"
}
] )

이 집계 튜토리얼을 시작하기 전에 새 C 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습 C 드라이버 시작하기 가이드 참조하세요.

C 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 agg-tutorial.c라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 C 시작하기 가이드의 연결 문자열 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

mongoc_collection_t *orders = mongoc_client_get_collection(client, "agg_tutorials_db", "orders");
mongoc_collection_t *products = mongoc_client_get_collection(client, "agg_tutorials_db", "products");
{
bson_t *filter = bson_new();
bson_error_t error;
if (!mongoc_collection_delete_many(orders, filter, NULL, NULL, &error))
{
fprintf(stderr, "Delete error: %s\n", error.message);
}
if (!mongoc_collection_delete_many(products, filter, NULL, NULL, &error))
{
fprintf(stderr, "Delete error: %s\n", error.message);
}
bson_destroy(filter);
}
{
size_t num_docs = 4;
bson_t *order_docs[num_docs];
order_docs[0] = BCON_NEW(
"customer_id", BCON_UTF8("elise_smith@myemail.com"),
"orderdate", BCON_DATE_TIME(1590822952000UL), // 2020-05-30T08:35:52Z
"product_id", BCON_UTF8("a1b2c3d4"),
"value", BCON_DOUBLE(431.43));
order_docs[1] = BCON_NEW(
"customer_id", BCON_UTF8("tj@wheresmyemail.com"),
"orderdate", BCON_DATE_TIME(1559063612000UL), // 2019-05-28T19:13:32Z
"product_id", BCON_UTF8("z9y8x7w6"),
"value", BCON_DOUBLE(5.01));
order_docs[2] = BCON_NEW(
"customer_id", BCON_UTF8("oranieri@warmmail.com"),
"orderdate", BCON_DATE_TIME(1577869537000UL), // 2020-01-01T08:25:37Z
"product_id", BCON_UTF8("ff11gg22hh33"),
"value", BCON_DOUBLE(63.13));
order_docs[3] = BCON_NEW(
"customer_id", BCON_UTF8("jjones@tepidmail.com"),
"orderdate", BCON_DATE_TIME(1608976546000UL), // 2020-12-26T08:55:46Z
"product_id", BCON_UTF8("a1b2c3d4"),
"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]);
}
}
{
size_t num_docs = 4;
bson_t *product_docs[num_docs];
product_docs[0] = BCON_NEW(
"id", BCON_UTF8("a1b2c3d4"),
"name", BCON_UTF8("Asus Laptop"),
"category", BCON_UTF8("ELECTRONICS"),
"description", BCON_UTF8("Good value laptop for students"));
product_docs[1] = BCON_NEW(
"id", BCON_UTF8("z9y8x7w6"),
"name", BCON_UTF8("The Day Of The Triffids"),
"category", BCON_UTF8("BOOKS"),
"description", BCON_UTF8("Classic post-apocalyptic novel"));
product_docs[2] = BCON_NEW(
"id", BCON_UTF8("ff11gg22hh33"),
"name", BCON_UTF8("Morphy Richardds Food Mixer"),
"category", BCON_UTF8("KITCHENWARE"),
"description", BCON_UTF8("Luxury mixer turning good cakes into great"));
product_docs[3] = BCON_NEW(
"id", BCON_UTF8("pqr678st"),
"name", BCON_UTF8("Karcher Hose Set"),
"category", BCON_UTF8("GARDEN"),
"description", BCON_UTF8("Hose + nosels + winder for tidy storage"));
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]);
}
}

집계 튜토리얼을 따라 하기 전에 새 C++ 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습 C++ 시작하기 튜토리얼을 참조하세요.

C++ 운전자 사용에 대해 자세히 학습하려면 API 설명서를 참조하세요.

C++ 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 agg-tutorial.cpp라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 C++ 시작하기 튜토리얼의 연결 문자열 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

auto orders = db["orders"];
auto products = db["products"];
std::vector<bsoncxx::document::value> order_docs = {
bsoncxx::from_json(R"({
"customer_id": "elise_smith@myemail.com",
"orderdate": {"$date": 1590821752000},
"product_id": "a1b2c3d4",
"value": 431.43
})"),
bsoncxx::from_json(R"({
"customer_id": "tj@wheresmyemail.com",
"orderdate": {"$date": 1559062412},
"product_id": "z9y8x7w6",
"value": 5.01
})"),
bsoncxx::from_json(R"({
"customer_id": "oranieri@warmmail.com",
"orderdate": {"$date": 1577861137},
"product_id": "ff11gg22hh33",
"value": 63.13
})"),
bsoncxx::from_json(R"({
"customer_id": "jjones@tepidmail.com",
"orderdate": {"$date": 1608972946000},
"product_id": "a1b2c3d4",
"value": 429.65
})")
};
orders.insert_many(order_docs); // Might throw an exception
std::vector<bsoncxx::document::value> product_docs = {
bsoncxx::from_json(R"({
"id": "a1b2c3d4",
"name": "Asus Laptop",
"category": "ELECTRONICS",
"description": "Good value laptop for students"
})"),
bsoncxx::from_json(R"({
"id": "z9y8x7w6",
"name": "The Day Of The Triffids",
"category": "BOOKS",
"description": "Classic post-apocalyptic novel"
})"),
bsoncxx::from_json(R"({
"id": "ff11gg22hh33",
"name": "Morphy Richardds Food Mixer",
"category": "KITCHENWARE",
"description": "Luxury mixer turning good cakes into great"
})"),
bsoncxx::from_json(R"({
"id": "pqr678st",
"name": "Karcher Hose Set",
"category": "GARDEN",
"description": "Hose + nosels + winder for tidy storage"
})")
};
products.insert_many(product_docs); // Might throw an exception

이 집계 튜토리얼을 시작하기 전에 새 C#/ .NET 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습하려면 C#/ .NET 드라이버 빠른 시작 가이드를 참조하세요.

C#/ .NET 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 다음 코드를 Program.cs 파일 에 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 C# 빠른 시작 가이드의 Atlas에서 무료 계층 클러스터 설정 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 ProductId 필드 기준으로 컬렉션을 조인합니다.

먼저 C# 클래스를 만들어 ordersproducts 컬렉션의 데이터를 모델링합니다.

public class Order
{
[BsonId]
public ObjectId Id { get; set; }
public string CustomerId { get; set; }
public DateTime OrderDate { get; set; }
public string ProductId { get; set; }
public double Value { get; set; }
}
public class Product
{
[BsonId]
public string Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public string Description { get; set; }
}

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

var orders = aggDB.GetCollection<Order>("orders");
var products = aggDB.GetCollection<Product>("products");
orders.DeleteMany(Builders<Order>.Filter.Empty);
products.DeleteMany(Builders<Product>.Filter.Empty);
orders.InsertMany(new List<Order>
{
new Order
{
CustomerId = "elise_smith@myemail.com",
OrderDate = DateTime.Parse("2020-05-30T08:35:52Z"),
ProductId = "a1b2c3d4",
Value = 431.43
},
new Order
{
CustomerId = "tj@wheresmyemail.com",
OrderDate = DateTime.Parse("2019-05-28T19:13:32Z"),
ProductId = "z9y8x7w6",
Value = 5.01
},
new Order
{
CustomerId = "oranieri@warmmail.com",
OrderDate = DateTime.Parse("2020-01-01T08:25:37Z"),
ProductId = "ff11gg22hh33",
Value = 63.13
},
new Order
{
CustomerId = "jjones@tepidmail.com",
OrderDate = DateTime.Parse("2020-12-26T08:55:46Z"),
ProductId = "a1b2c3d4",
Value = 429.65
}
});
products.InsertMany(new List<Product>
{
new Product
{
Id = "a1b2c3d4",
Name = "Asus Laptop",
Category = "ELECTRONICS",
Description = "Good value laptop for students"
},
new Product
{
Id = "z9y8x7w6",
Name = "The Day Of The Triffids",
Category = "BOOKS",
Description = "Classic post-apocalyptic novel"
},
new Product
{
Id = "ff11gg22hh33",
Name = "Morphy Richardds Food Mixer",
Category = "KITCHENWARE",
Description = "Luxury mixer turning good cakes into great"
},
new Product
{
Id = "pqr678st",
Name = "Karcher Hose Set",
Category = "GARDEN",
Description = "Hose + nosels + winder for tidy storage"
}
});

이 집계 튜토리얼을 시작하기 전에 새 고 (Go) 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습하려면 고 (Go) 드라이버 빠른 시작 가이드를 참조하세요.

고 (Go) 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 agg_tutorial.go라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포서버의 연결 문자열 찾는 방법을 학습하려면 고 (Go) 빠른 시작 가이드의 MongoDB 클러스터 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

먼저 고 (Go) 구조체를 만들어 ordersproducts 컬렉션의 데이터를 모델링합니다.

type Order struct {
CustomerID string `bson:"customer_id"`
OrderDate bson.DateTime `bson:"orderdate"`
ProductID string `bson:"product_id"`
Value float32 `bson:"value"`
}
type Product struct {
ID string `bson:"id"`
Name string `bson:"name"`
Category string `bson:"category"`
Description string `bson:"description"`
}

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

orders := aggDB.Collection("orders")
products := aggDB.Collection("products")
orders.DeleteMany(context.TODO(), bson.D{})
products.DeleteMany(context.TODO(), bson.D{})
_, err = orders.InsertMany(context.TODO(), []interface{}{
Order{
CustomerID: "elise_smith@myemail.com",
OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 5, 30, 8, 35, 52, 0, time.UTC)),
ProductID: "a1b2c3d4",
Value: 431.43,
},
Order{
CustomerID: "tj@wheresmyemail.com",
OrderDate: bson.NewDateTimeFromTime(time.Date(2019, 5, 28, 19, 13, 32, 0, time.UTC)),
ProductID: "z9y8x7w6",
Value: 5.01,
},
Order{
CustomerID: "oranieri@warmmail.com",
OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 01, 01, 8, 25, 37, 0, time.UTC)),
ProductID: "ff11gg22hh33",
Value: 63.13,
},
Order{
CustomerID: "jjones@tepidmail.com",
OrderDate: bson.NewDateTimeFromTime(time.Date(2020, 12, 26, 8, 55, 46, 0, time.UTC)),
ProductID: "a1b2c3d4",
Value: 429.65,
},
})
if err != nil {
log.Fatal(err)
}
_, err = products.InsertMany(context.TODO(), []interface{}{
Product{
ID: "a1b2c3d4",
Name: "Asus Laptop",
Category: "ELECTRONICS",
Description: "Good value laptop for students",
},
Product{
ID: "z9y8x7w6",
Name: "The Day Of The Triffids",
Category: "BOOKS",
Description: "Classic post-apocalyptic novel",
},
Product{
ID: "ff11gg22hh33",
Name: "Morphy Richardds Food Mixer",
Category: "KITCHENWARE",
Description: "Luxury mixer turning good cakes into great",
},
Product{
ID: "pqr678st",
Name: "Karcher Hose Set",
Category: "GARDEN",
Description: "Hose + nosels + winder for tidy storage",
},
})
if err != nil {
log.Fatal(err)
}

집계 튜토리얼을 시작하기 전에 새 Java 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습 Java 드라이버 시작하기 가이드참조하세요.

Java Sync 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 AggTutorial.java라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 Java Sync 빠른 시작 가이드의 연결 문자열 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

MongoCollection<Document> orders = aggDB.getCollection("orders");
MongoCollection<Document> products = aggDB.getCollection("products");
orders.deleteMany(Filters.empty());
products.deleteMany(Filters.empty());
orders.insertMany(
Arrays.asList(
new Document("customer_id", "elise_smith@myemail.com")
.append("orderdate", LocalDateTime.parse("2020-05-30T08:35:52"))
.append("product_id", "a1b2c3d4")
.append("value", 431.43),
new Document("customer_id", "tj@wheresmyemail.com")
.append("orderdate", LocalDateTime.parse("2019-05-28T19:13:32"))
.append("product_id", "z9y8x7w6")
.append("value", 5.01),
new Document("customer_id", "oranieri@warmmail.com")
.append("orderdate", LocalDateTime.parse("2020-01-01T08:25:37"))
.append("product_id", "ff11gg22hh33")
.append("value", 63.13),
new Document("customer_id", "jjones@tepidmail.com")
.append("orderdate", LocalDateTime.parse("2020-12-26T08:55:46"))
.append("product_id", "a1b2c3d4")
.append("value", 429.65)
)
);
products.insertMany(
Arrays.asList(
new Document("id", "a1b2c3d4")
.append("name", "Asus Laptop")
.append("category", "ELECTRONICS")
.append("description", "Good value laptop for students"),
new Document("id", "z9y8x7w6")
.append("name", "The Day Of The Triffids")
.append("category", "BOOKS")
.append("description", "Classic post-apocalyptic novel"),
new Document("id", "ff11gg22hh33")
.append("name", "Morphy Richardds Food Mixer")
.append("category", "KITCHENWARE")
.append("description", "Luxury mixer turning good cakes into great"),
new Document("id", "pqr678st")
.append("name", "Karcher Hose Set")
.append("category", "GARDEN")
.append("description", "Hose + nosels + winder for tidy storage")
)
);

집계 튜토리얼을 시작하기 전에 새 코틀린 (Kotlin) 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습 코틀린 (Kotlin) ) 드라이버 빠른 시작 가이드참조하세요.

코틀린 (Kotlin) ) 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 외에도 build.gradle.kts 파일 에 다음 종속성을 추가하고 프로젝트 다시 로드해야 합니다.

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

운전자 설치한 후 AggTutorial.kt라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 코틀린 (Kotlin) 드라이버 빠른 시작 가이드의 클러스터에 연결 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

먼저 코틀린 (Kotlin) 데이터 클래스를 만들어 ordersproducts 컬렉션의 데이터를 모델링합니다.

@Serializable
data class Order(
val customerID: String,
@Contextual val orderDate: LocalDateTime,
val productID: String,
val value: Double
)
@Serializable
data class Product(
val ID: String,
val name: String,
val category: String,
val description: String
)

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

val orders = aggDB.getCollection<Order>("orders")
val products = aggDB.getCollection<Product>("products")
orders.deleteMany(Filters.empty());
products.deleteMany(Filters.empty());
orders.insertMany(
listOf(
Order("elise_smith@myemail.com", LocalDateTime.parse("2020-05-30T08:35:52"), "a1b2c3d4", 431.43),
Order("tj@wheresmyemail.com", LocalDateTime.parse("2019-05-28T19:13:32"), "z9y8x7w6", 5.01),
Order("oranieri@warmmail.com", LocalDateTime.parse("2020-01-01T08:25:37"), "ff11gg22hh33", 63.13),
Order("jjones@tepidmail.com", LocalDateTime.parse("2020-12-26T08:55:46"), "a1b2c3d4", 429.65)
)
)
products.insertMany(
listOf(
Product("a1b2c3d4", "Asus Laptop", "ELECTRONICS", "Good value laptop for students"),
Product("z9y8x7w6", "The Day Of The Triffids", "BOOKS", "Classic post-apocalyptic novel"),
Product(
"ff11gg22hh33",
"Morphy Richardds Food Mixer",
"KITCHENWARE",
"Luxury mixer turning good cakes into great"
),
Product("pqr678st", "Karcher Hose Set", "GARDEN", "Hose + nosels + winder for tidy storage")
)
)

이 집계 튜토리얼을 따라 시작하기 전에 새 Node.js 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습하려면 Node.js 드라이버 빠른 시작 가이드를 참조하세요.

Node.js 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 agg_tutorial.js라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 Node.js 빠른 시작 가이드의 연결 문자열 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

const orders = aggDB.collection("orders");
const products = aggDB.collection("products");
await orders.deleteMany({});
await products.deleteMany({});
await orders.insertMany([
{
customer_id: "elise_smith@myemail.com",
orderdate: new Date("2020-05-30T08:35:52Z"),
product_id: "a1b2c3d4",
value: 431.43,
},
{
customer_id: "tj@wheresmyemail.com",
orderdate: new Date("2019-05-28T19:13:32Z"),
product_id: "z9y8x7w6",
value: 5.01,
},
{
customer_id: "oranieri@warmmail.com",
orderdate: new Date("2020-01-01T08:25:37Z"),
product_id: "ff11gg22hh33",
value: 63.13,
},
{
customer_id: "jjones@tepidmail.com",
orderdate: new Date("2020-12-26T08:55:46Z"),
product_id: "a1b2c3d4",
value: 429.65,
},
]);
await products.insertMany([
{
id: "a1b2c3d4",
name: "Asus Laptop",
category: "ELECTRONICS",
description: "Good value laptop for students",
},
{
id: "z9y8x7w6",
name: "The Day Of The Triffids",
category: "BOOKS",
description: "Classic post-apocalyptic novel",
},
{
id: "ff11gg22hh33",
name: "Morphy Richardds Food Mixer",
category: "KITCHENWARE",
description: "Luxury mixer turning good cakes into great",
},
{
id: "pqr678st",
name: "Karcher Hose Set",
category: "GARDEN",
description: "Hose + nosels + winder for tidy storage",
},
]);

이 집계 튜토리얼을 시작하기 전에 새 PHP 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

PHP 라이브러리를 설치하고 MongoDB 에 연결하는 방법을 학습하려면 PHP 라이브러리 시작하기 튜토리얼을 참조하세요.

PHP 라이브러리에서 애그리게이션을 수행하는 방법에 대해 자세히 학습하려면 애그리게이션 가이드를 참조하세요.

라이브러리를 설치한 후 agg_tutorial.php라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습 PHP 라이브러리 시작하기 튜토리얼의 연결 문자열 만들기 단계 를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

$orders = $client->agg_tutorials_db->orders;
$products = $client->agg_tutorials_db->products;
$orders->deleteMany([]);
$products->deleteMany([]);
$orders->insertMany(
[
[
'customer_id' => 'elise_smith@myemail.com',
'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-05-30T08:35:52')),
'product_id' => 'a1b2c3d4',
'value' => 431.43
],
[
'customer_id' => 'tj@wheresmyemail.com',
'orderdate' => new UTCDateTime(new DateTimeImmutable('2019-05-28T19:13:32')),
'product_id' => 'z9y8x7w6',
'value' => 5.01
],
[
'customer_id' => 'oranieri@warmmail.com',
'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-01-01T08:25:37')),
'product_id' => 'ff11gg22hh33',
'value' => 63.13,
],
[
'customer_id' => 'jjones@tepidmail.com',
'orderdate' => new UTCDateTime(new DateTimeImmutable('2020-12-26T08:55:46')),
'product_id' => 'a1b2c3d4',
'value' => 429.65
],
]
);
$products->insertMany(
[
[
'id' => 'a1b2c3d4',
'name' => 'Asus Laptop',
'category' => 'ELECTRONICS',
'description' => 'Good value laptop for students',
],
[
'id' => 'z9y8x7w6',
'name' => 'The Day Of The Triffids',
'category' => 'BOOKS',
'description' => 'Classic post-apocalyptic novel',
],
[
'id' => 'ff11gg22hh33',
'name' => 'Morphy Richardds Food Mixer',
'category' => 'KITCHENWARE',
'description' => 'Luxury mixer turning good cakes into great',
],
[
'id' => 'pqr678st',
'name' => 'Karcher Hose Set',
'category' => 'GARDEN',
'description' => 'Hose + nosels + winder for tidy storage',
],
]
);

이 집계 튜토리얼을 따라 시작하기 전에 새 Python 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

PyMongo 설치하고 MongoDB 에 연결하는 방법을 학습 PyMongo 시작하기 튜토리얼을 참조하세요.

PyMongo 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습하려면 애그리게이션 가이드를 참조하세요.

라이브러리를 설치한 후 agg_tutorial.py라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습 PHP 라이브러리 시작하기 튜토리얼의 연결 문자열 만들기 단계 를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

orders_coll = agg_db["orders"]
products_coll = agg_db["products"]
orders_coll.delete_many({})
products_coll.delete_many({})
order_data = [
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 5, 30, 8, 35, 52),
"product_id": "a1b2c3d4",
"value": 431.43,
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2019, 5, 28, 19, 13, 32),
"product_id": "z9y8x7w6",
"value": 5.01,
},
{
"customer_id": "oranieri@warmmail.com",
"orderdate": datetime(2020, 1, 1, 8, 25, 37),
"product_id": "ff11gg22hh33",
"value": 63.13,
},
{
"customer_id": "jjones@tepidmail.com",
"orderdate": datetime(2020, 12, 26, 8, 55, 46),
"product_id": "a1b2c3d4",
"value": 429.65,
},
]
orders_coll.insert_many(order_data)
product_data = [
{
"id": "a1b2c3d4",
"name": "Asus Laptop",
"category": "ELECTRONICS",
"description": "Good value laptop for students",
},
{
"id": "z9y8x7w6",
"name": "The Day Of The Triffids",
"category": "BOOKS",
"description": "Classic post-apocalyptic novel",
},
{
"id": "ff11gg22hh33",
"name": "Morphy Richardds Food Mixer",
"category": "KITCHENWARE",
"description": "Luxury mixer turning good cakes into great",
},
{
"id": "pqr678st",
"name": "Karcher Hose Set",
"category": "GARDEN",
"description": "Hose + nosels + winder for tidy storage",
},
]
products_coll.insert_many(product_data)

이 집계 튜토리얼을 시작하기 전에 새 Ruby 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

Ruby 드라이버 설치하고 MongoDB 에 연결하는 방법을 학습하려면 Ruby 드라이버 시작하기 가이드를 참조하세요.

Ruby 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습하려면 애그리게이션 가이드를 참조하세요.

운전자 설치한 후 agg_tutorial.rb라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

# 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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 Ruby 시작하기 가이드의 연결 문자열 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

orders = agg_db[:orders]
products = agg_db[:products]
orders.delete_many({})
products.delete_many({})
orders.insert_many(
[
{
customer_id: "elise_smith@myemail.com",
orderdate: DateTime.parse("2020-05-30T08:35:52Z"),
product_id: "a1b2c3d4",
value: 431.43,
},
{
customer_id: "tj@wheresmyemail.com",
orderdate: DateTime.parse("2019-05-28T19:13:32Z"),
product_id: "z9y8x7w6",
value: 5.01,
},
{
customer_id: "oranieri@warmmail.com",
orderdate: DateTime.parse("2020-01-01T08:25:37Z"),
product_id: "ff11gg22hh33",
value: 63.13,
},
{
customer_id: "jjones@tepidmail.com",
orderdate: DateTime.parse("2020-12-26T08:55:46Z"),
product_id: "a1b2c3d4",
value: 429.65,
},
]
)
products.insert_many(
[
{
id: "a1b2c3d4",
name: "Asus Laptop",
category: "ELECTRONICS",
description: "Good value laptop for students",
},
{
id: "z9y8x7w6",
name: "The Day Of The Triffids",
category: "BOOKS",
description: "Classic post-apocalyptic novel",
},
{
id: "ff11gg22hh33",
name: "Morphy Richardds Food Mixer",
category: "KITCHENWARE",
description: "Luxury mixer turning good cakes into great",
},
{
id: "pqr678st",
name: "Karcher Hose Set",
category: "GARDEN",
description: "Hose + nosels + winder for tidy storage",
},
]
)

이 집계 튜토리얼을 시작하기 전에 새 Rust 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습 Rust 드라이버 빠른 시작 가이드참조하세요.

Rust 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 agg-tutorial.rs라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포서버의 연결 문자열 찾는 방법을 학습하려면 Rust 빠른 시작 가이드의 연결 문자열 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

먼저 Rust 구조체를 만들어 ordersproducts 컬렉션의 데이터를 모델링합니다.

#[derive(Debug, Serialize, Deserialize)]
struct Order {
customer_id: String,
order_date: DateTime,
product_id: String,
value: f32,
}
#[derive(Debug, Serialize, Deserialize)]
struct Product {
id: String,
name: String,
category: String,
description: String,
}

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

let orders: Collection<Order> = agg_db.collection("orders");
let products: Collection<Product> = agg_db.collection("products");
orders.delete_many(doc! {}).await?;
products.delete_many(doc! {}).await?;
let order_docs = vec![
Order {
customer_id: "elise_smith@myemail.com".to_string(),
order_date: DateTime::builder().year(2020).month(5).day(30).hour(8).minute(35).second(52).build().unwrap(),
product_id: "a1b2c3d4".to_string(),
value: 431.43,
},
Order {
customer_id: "tj@wheresmyemail.com".to_string(),
order_date: DateTime::builder().year(2019).month(5).day(28).hour(19).minute(13).second(32).build().unwrap(),
product_id: "z9y8x7w6".to_string(),
value: 5.01,
},
Order {
customer_id: "oranieri@warmmail.com".to_string(),
order_date: DateTime::builder().year(2020).month(1).day(1).hour(8).minute(25).second(37).build().unwrap(),
product_id: "ff11gg22hh33".to_string(),
value: 63.13,
},
Order {
customer_id: "jjones@tepidmail.com".to_string(),
order_date: DateTime::builder().year(2020).month(12).day(26).hour(8).minute(55).second(46).build().unwrap(),
product_id: "a1b2c3d4".to_string(),
value: 429.65,
},
];
orders.insert_many(order_docs).await?;
let product_docs = vec![
Product {
id: "a1b2c3d4".to_string(),
name: "Asus Laptop".to_string(),
category: "ELECTRONICS".to_string(),
description: "Good value laptop for students".to_string(),
},
Product {
id: "z9y8x7w6".to_string(),
name: "The Day Of The Triffids".to_string(),
category: "BOOKS".to_string(),
description: "Classic post-apocalyptic novel".to_string(),
},
Product {
id: "ff11gg22hh33".to_string(),
name: "Morphy Richardds Food Mixer".to_string(),
category: "KITCHENWARE".to_string(),
description: "Luxury mixer turning good cakes into great".to_string(),
},
Product {
id: "pqr678st".to_string(),
name: "Karcher Hose Set".to_string(),
category: "GARDEN".to_string(),
description: "Hose + nosels + winder for tidy storage".to_string(),
},
];
products.insert_many(product_docs).await?;

집계 튜토리얼을 시작하기 전에 새 스칼라 앱 설정하다 해야 합니다. 이 앱 사용하여 MongoDB deployment 에 연결하고, 샘플 데이터를 MongoDB 에 삽입하고, 집계 파이프라인 실행 .

운전자 설치하고 MongoDB 에 연결하는 방법을 학습 스칼라 드라이버 시작하기 가이드 참조하세요.

스칼라 드라이버 에서 애그리게이션을 수행하는 방법에 대해 자세히 학습 애그리게이션 가이드참조하세요.

운전자 설치한 후 AggTutorial.scala라는 파일 만듭니다. 이 파일 에 다음 코드를 붙여넣어 집계 튜토리얼을 위한 앱 템플릿을 만듭니다.

중요

다음 코드에서 코드 주석을 읽고 팔로우 중인 튜토리얼에 대해 수정해야 하는 코드 섹션을 찾습니다.

변경하지 않고 코드를 실행하려고 하면 연결 오류가 발생합니다.

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

모든 튜토리얼에서는 연결 문자열 자리 표시자를 반드시 배포서버의 연결 문자열로 바꿔야 합니다.

배포의 연결 문자열 찾는 방법을 학습하려면 스칼라 드라이버 시작하기 가이드의 연결 문자열 만들기 단계를 참조하세요.

예를 들어 연결 문자열이 "mongodb+srv://mongodb-example:27017" 인 경우 연결 문자열 할당은 다음과 유사합니다.

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

이 예제에서는 두 개의 collection을 사용합니다:

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서

  • products: 상점에서 판매하는 제품을 설명하는 문서

주문에는 하나의 제품만 포함될 수 있습니다. 집계 일대일 조인을 사용하여 주문 문서 해당 제품 문서 와 일치시킵니다. 집계 두 컬렉션의 문서에 존재하는 product_id 필드 기준으로 컬렉션을 조인합니다.

ordersproducts 컬렉션을 만들고 샘플 데이터를 삽입하려면 애플리케이션 에 다음 코드를 추가합니다.

val orders = aggDB.getCollection("orders")
val products = aggDB.getCollection("products")
orders.deleteMany(Filters.empty()).subscribe(
_ => {},
e => println("Error: " + e.getMessage),
)
products.deleteMany(Filters.empty()).subscribe(
_ => {},
e => println("Error: " + e.getMessage),
)
val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
orders.insertMany(
Seq(
Document(
"customer_id" -> "elise_smith@myemail.com",
"orderdate" -> dateFormat.parse("2020-05-30T08:35:52"),
"product_id" -> "a1b2c3d4",
"value" -> 431.43
),
Document(
"customer_id" -> "tj@wheresmyemail.com",
"orderdate" -> dateFormat.parse("2019-05-28T19:13:32"),
"product_id" -> "z9y8x7w6",
"value" -> 5.01
),
Document(
"customer_id" -> "oranieri@warmmail.com",
"orderdate" -> dateFormat.parse("2020-01-01T08:25:37"),
"product_id" -> "ff11gg22hh33",
"value" -> 63.13
),
Document(
"customer_id" -> "jjones@tepidmail.com",
"orderdate" -> dateFormat.parse("2020-12-26T08:55:46"),
"product_id" -> "a1b2c3d4",
"value" -> 429.65
)
)
).subscribe(
_ => {},
e => println("Error: " + e.getMessage),
)
products.insertMany(
Seq(
Document(
"id" -> "a1b2c3d4",
"name" -> "Asus Laptop",
"category" -> "ELECTRONICS",
"description" -> "Good value laptop for students"
),
Document(
"id" -> "z9y8x7w6",
"name" -> "The Day Of The Triffids",
"category" -> "BOOKS",
"description" -> "Classic post-apocalyptic novel"
),
Document(
"id" -> "ff11gg22hh33",
"name" -> "Morphy Richardds Food Mixer",
"category" -> "KITCHENWARE",
"description" -> "Luxury mixer turning good cakes into great"
),
Document(
"id" -> "pqr678st",
"name" -> "Karcher Hose Set",
"category" -> "GARDEN",
"description" -> "Hose + nosels + winder for tidy storage"
)
)
).subscribe(
_ => {},
e => println("Error: " + e.getMessage),
)

다음 단계에서는 집계 파이프라인 만들고 실행 단일 공통 필드 에서 컬렉션을 조인하는 방법을 보여 줍니다.

1
db.orders.aggregate( [
// Stage 1: Match orders that were placed in 2020
{ $match: {
orderdate: {
$gte: new Date("2020-01-01T00:00:00Z"),
$lt: new Date("2021-01-01T00:00:00Z")
}
} },
// Stage 2: Link the collections
{ $lookup: {
from: "products",
localField: "product_id",
foreignField: "p_id",
as: "product_mapping"
} },
// Stage 3: Create new document fields
{ $set: {
product_mapping: { $first: "$product_mapping" }
} },
{ $set: {
product_name: "$product_mapping.name",
product_category: "$product_mapping.category"
} },
// Stage 4: Remove unneeded fields
{ $unset: ["_id", "product_id", "product_mapping"] }
] )

이 예시 에서 $lookup 단계는 항상 하나의 문서 포함하는 product_mapping 배열 출력합니다. $lookup 단계 이후의 $set 단계는 $first 를 사용하여 product_mapping 배열 에서 문서 추출합니다. $lookup 단계에서 둘 이상의 문서 배열 출력하는 설정에서 이 파이프라인 사용하는 경우 $lookup 단계에서 명시적 { $limit: 1 } 단계를 사용하는 것이 좋습니다.

참고

foreignField 에 지원하는 인덱스 없는 경우 단일 조인으로 동등성 매치 수행하는 $lookup 작업의 성능이 저하될 수 있습니다. 자세한 내용은 성능 고려 사항 조회인덱스 생성을 참조하세요.

2

애그리게이션된 결과에는 세 개의 문서가 포함되어 있습니다. 문서는 주문한 제품의 product_nameproduct_category 와 함께 2020에 발생한 고객 주문을 나타냅니다.

{
customer_id: 'elise_smith@myemail.com',
orderdate: ISODate('2020-05-30T08:35:52.000Z'),
value: 431.43,
product_name: 'Asus Laptop',
product_category: 'ELECTRONICS'
}
{
customer_id: 'oranieri@warmmail.com',
orderdate: ISODate('2020-01-01T08:25:37.000Z'),
value: 63.13,
product_name: 'Morphy Richardds Food Mixer',
product_category: 'KITCHENWARE'
}
{
customer_id: 'jjones@tepidmail.com',
orderdate: ISODate('2020-12-26T08:55:46.000Z'),
value: 429.65,
product_name: 'Asus Laptop',
product_category: 'ELECTRONICS'
}

결과는 orders 컬렉션 및 각 원본 문서 에 있는 product_id 필드 일치시켜 결합된 products 컬렉션 문서의 필드를 포함하는 문서로 구성됩니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

"{", "$match", "{",
"orderdate", "{",
"$gte", BCON_DATE_TIME(1577836800000UL),
"$lt", BCON_DATE_TIME(1609459200000UL),
"}",
"}", "}",
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

"{", "$lookup", "{",
"from", BCON_UTF8("products"),
"localField", BCON_UTF8("product_id"),
"foreignField", BCON_UTF8("id"),
"as", BCON_UTF8("product_mapping"),
"}", "}",
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

"{", "$set", "{", "product_mapping", "{", "$first", BCON_UTF8("$product_mapping"), "}", "}", "}",
"{", "$set", "{",
"product_name", BCON_UTF8("$product_mapping.name"),
"product_category", BCON_UTF8("$product_mapping.category"),
"}", "}",

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

"{", "$unset", "[", BCON_UTF8("_id"), BCON_UTF8("product_id"), BCON_UTF8("product_mapping"), "]", "}",
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

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

정리 문에 다음 줄을 추가하여 컬렉션 리소스를 정리해야 합니다.

mongoc_collection_destroy(orders);
mongoc_collection_destroy(products);

마지막으로 셸 에서 다음 명령을 실행 실행 파일을 생성하고 실행 .

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

한 번의 호출에서 앞의 명령을 실행 데 연결 오류가 발생하는 경우 별도로 실행 수 있습니다.

6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{ "customer_id" : "elise_smith@myemail.com", "orderdate" : { "$date" : { "$numberLong" : "1590822952000" } }, "value" : { "$numberDouble" : "431.43000000000000682" }, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" }
{ "customer_id" : "oranieri@warmmail.com", "orderdate" : { "$date" : { "$numberLong" : "1577869537000" } }, "value" : { "$numberDouble" : "63.130000000000002558" }, "product_name" : "Morphy Richardds Food Mixer", "product_category" : "KITCHENWARE" }
{ "customer_id" : "jjones@tepidmail.com", "orderdate" : { "$date" : { "$numberLong" : "1608976546000" } }, "value" : { "$numberDouble" : "429.64999999999997726" }, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" }

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

pipeline.match(bsoncxx::from_json(R"({
"orderdate": {
"$gte": {"$date": 1577836800},
"$lt": {"$date": 1609459200000}
}
})"));
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

pipeline.lookup(bsoncxx::from_json(R"({
"from": "products",
"localField": "product_id",
"foreignField": "id",
"as": "product_mapping"
})"));
3

다음으로, 파이프라인에 두 개의 $addFields 단계를 추가합니다.

첫 번째 $addFields 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $addFields 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

pipeline.add_fields(bsoncxx::from_json(R"({
"product_mapping": {"$first": "$product_mapping"}
})"));
pipeline.add_fields(bsoncxx::from_json(R"({
"product_name": "$product_mapping.name",
"product_category": "$product_mapping.category"
})"));

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

pipeline.append_stage(bsoncxx::from_json(R"({
"$unset": ["_id", "product_id", "product_mapping"]
})"));
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

auto cursor = orders.aggregate(pipeline);

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

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

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{ "customer_id" : "elise_smith@myemail.com", "orderdate" : { "$date" : "2020-05-30T06:55:52Z" },
"value" : 431.43000000000000682, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" }
{ "customer_id" : "oranieri@warmmail.com", "orderdate" : { "$date" : "1970-01-19T06:17:41.137Z" },
"value" : 63.130000000000002558, "product_name" : "Morphy Richardds Food Mixer", "product_category" : "KITCHENWARE" }
{ "customer_id" : "jjones@tepidmail.com", "orderdate" : { "$date" : "2020-12-26T08:55:46Z" },
"value" : 429.64999999999997726, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" }

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

먼저 orders 컬렉션에서 집계 시작하고 $match 단계와 2020에 접수된 주문과 일치하는 단계를 연결합니다.

var results = orders.Aggregate()
.Match(o => o.OrderDate >= DateTime.Parse("2020-01-01T00:00:00Z") &&
o.OrderDate < DateTime.Parse("2021-01-01T00:00:00Z"))
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 ProductId 필드 products 컬렉션 의 Id 필드 에 조인합니다.

.Lookup<Product, Order>(
foreignCollectionName: "products",
localField: "ProductId",
foreignField: "Id",
@as: "ProductMapping"
)
3

다음으로, 파이프라인에 $project 단계를 추가합니다.

$project 단계에서는 ProductMapping 객체 필드 에 있는 각 값의 첫 번째 항목에서 ProductNameProductCategory라는 두 개의 새 필드를 생성합니다. 이 단계에서는 출력 문서에 포함하고 제외할 필드도 지정합니다.

.Project(new BsonDocument
{
{ "ProductName", new BsonDocument("$first", "$ProductMapping.Name") },
{ "ProductCategory", new BsonDocument("$first", "$ProductMapping.Category") },
{ "OrderDate", 1 },
{ "CustomerId", 1 },
{ "Value", 1 },
{ "_id", 0 },
});

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 IDE에서 애플리케이션 실행 하고 결과를 검사합니다.

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 ProductNameProductCategory 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{ "CustomerId" : "elise_smith@myemail.com", "OrderDate" : { "$date" : "2020-05-30T08:35:52Z" }, "Value" : 431.43000000000001, "ProductName" : "Asus Laptop", "ProductCategory" : "ELECTRONICS" }
{ "CustomerId" : "oranieri@warmmail.com", "OrderDate" : { "$date" : "2020-01-01T08:25:37Z" }, "Value" : 63.130000000000003, "ProductName" : "Morphy Richardds Food Mixer", "ProductCategory" : "KITCHENWARE" }
{ "CustomerId" : "jjones@tepidmail.com", "OrderDate" : { "$date" : "2020-12-26T08:55:46Z" }, "Value" : 429.64999999999998, "ProductName" : "Asus Laptop", "ProductCategory" : "ELECTRONICS" }

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 ProductId 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

matchStage := bson.D{{Key: "$match", Value: bson.D{
{Key: "orderdate", Value: bson.D{
{Key: "$gte", Value: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)},
{Key: "$lt", Value: time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)},
}},
}}}
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

lookupStage := bson.D{{Key: "$lookup", Value: bson.D{
{Key: "from", Value: "products"},
{Key: "localField", Value: "product_id"},
{Key: "foreignField", Value: "id"},
{Key: "as", Value: "product_mapping"},
}}}
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

setStage1 := bson.D{{Key: "$set", Value: bson.D{
{Key: "product_mapping", Value: bson.D{{Key: "$first", Value: "$product_mapping"}}},
}}}
setStage2 := bson.D{{Key: "$set", Value: bson.D{
{Key: "product_name", Value: "$product_mapping.name"},
{Key: "product_category", Value: "$product_mapping.category"},
}}}

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

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

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

pipeline := mongo.Pipeline{matchStage, lookupStage, setStage1, setStage2, unsetStage}
cursor, err := orders.Aggregate(context.TODO(), pipeline)

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

go run agg_tutorial.go
6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{"customer_id":"elise_smith@myemail.com","orderdate":{"$date":"2020-05-30T08:35:52Z"},"value":431.42999267578125,"product_name":"Asus Laptop","product_category":"ELECTRONICS"}
{"customer_id":"oranieri@warmmail.com","orderdate":{"$date":"2020-01-01T08:25:37Z"},"value":63.130001068115234,"product_name":"Morphy Richardds Food Mixer","product_category":"KITCHENWARE"}
{"customer_id":"jjones@tepidmail.com","orderdate":{"$date":"2020-12-26T08:55:46Z"},"value":429.6499938964844,"product_name":"Asus Laptop","product_category":"ELECTRONICS"}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

pipeline.add(Aggregates.match(Filters.and(
Filters.gte("orderdate", LocalDateTime.parse("2020-01-01T00:00:00")),
Filters.lt("orderdate", LocalDateTime.parse("2021-01-01T00:00:00"))
)));
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

pipeline.add(Aggregates.lookup(
"products",
"product_id",
"id",
"product_mapping"
));
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

pipeline.add(Aggregates.set(
new Field<>(
"product_mapping",
new Document("$first", "$product_mapping")
)
));
pipeline.add(Aggregates.set(
new Field<>("product_name", "$product_mapping.name"),
new Field<>("product_category", "$product_mapping.category")
));

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

pipeline.add(Aggregates.unset("_id", "product_id", "product_mapping"));
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

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

마지막으로 IDE에서 애플리케이션 실행 .

6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{"customer_id": "elise_smith@myemail.com", "orderdate": {"$date": "2020-05-30T08:35:52Z"}, "value": 431.43, "product_name": "Asus Laptop", "product_category": "ELECTRONICS"}
{"customer_id": "oranieri@warmmail.com", "orderdate": {"$date": "2020-01-01T08:25:37Z"}, "value": 63.13, "product_name": "Morphy Richardds Food Mixer", "product_category": "KITCHENWARE"}
{"customer_id": "jjones@tepidmail.com", "orderdate": {"$date": "2020-12-26T08:55:46Z"}, "value": 429.65, "product_name": "Asus Laptop", "product_category": "ELECTRONICS"}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

pipeline.add(
Aggregates.match(
Filters.and(
Filters.gte(
Order::orderDate.name,
LocalDateTime.parse("2020-01-01T00:00:00").toJavaLocalDateTime()
),
Filters.lt(Order::orderDate.name, LocalDateTime.parse("2021-01-01T00:00:00").toJavaLocalDateTime())
)
)
)
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 productID 필드 products 컬렉션 의 ID 필드 에 조인합니다.

pipeline.add(
Aggregates.lookup(
"products",
Order::productID.name,
Product::ID.name,
"product_mapping"
)
)
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

pipeline.add(
Aggregates.set(Field("product_mapping", Document("\$first", "\$product_mapping")))
)
pipeline.add(
Aggregates.set(
Field("product_name", "\$product_mapping.name"),
Field("product_category", "\$product_mapping.category")
)
)

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

pipeline.add(Aggregates.unset("_id", Order::productID.name, "product_mapping"))
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

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

마지막으로 IDE에서 애플리케이션 실행 .

6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

Document{{customerID=elise_smith@myemail.com, orderDate=Sat May 30 04:35:52 EDT 2020, value=431.43, product_name=Asus Laptop, product_category=ELECTRONICS}}
Document{{customerID=oranieri@warmmail.com, orderDate=Wed Jan 01 03:25:37 EST 2020, value=63.13, product_name=Morphy Richardds Food Mixer, product_category=KITCHENWARE}}
Document{{customerID=jjones@tepidmail.com, orderDate=Sat Dec 26 03:55:46 EST 2020, value=429.65, product_name=Asus Laptop, product_category=ELECTRONICS}}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

pipeline.push({
$match: {
orderdate: {
$gte: new Date("2020-01-01T00:00:00Z"),
$lt: new Date("2021-01-01T00:00:00Z"),
},
},
});
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

pipeline.push({
$lookup: {
from: "products",
localField: "product_id",
foreignField: "id",
as: "product_mapping",
},
});
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

pipeline.push(
{
$set: {
product_mapping: { $first: "$product_mapping" },
},
},
{
$set: {
product_name: "$product_mapping.name",
product_category: "$product_mapping.category",
},
}
);

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

pipeline.push({ $unset: ["_id", "product_id", "product_mapping"] });
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

const aggregationResult = await orders.aggregate(pipeline);

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

node agg_tutorial.js
6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{
customer_id: 'elise_smith@myemail.com',
orderdate: 2020-05-30T08:35:52.000Z,
value: 431.43,
product_name: 'Asus Laptop',
product_category: 'ELECTRONICS'
}
{
customer_id: 'oranieri@warmmail.com',
orderdate: 2020-01-01T08:25:37.000Z,
value: 63.13,
product_name: 'Morphy Richardds Food Mixer',
product_category: 'KITCHENWARE'
}
{
customer_id: 'jjones@tepidmail.com',
orderdate: 2020-12-26T08:55:46.000Z,
value: 429.65,
product_name: 'Asus Laptop',
product_category: 'ELECTRONICS'
}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

Stage::match(
orderdate: [
Query::gte(new UTCDateTime(new DateTimeImmutable('2020-01-01T00:00:00'))),
Query::lt(new UTCDateTime(new DateTimeImmutable('2021-01-01T00:00:00'))),
]
),
2

Pipeline 인스턴스 외부에서 팩토리 함수에 $lookup 단계를 만듭니다. ``$lookup`` 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

function lookupProductsStage()
{
return Stage::lookup(
from: 'products',
localField: 'product_id',
foreignField: 'id',
as: 'product_mapping',
);
}

그런 다음 Pipeline 인스턴스 에서 lookupProductsStage() 함수를 호출합니다.

lookupProductsStage(),
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

Stage::set(
product_mapping: Expression::first(
Expression::arrayFieldPath('product_mapping')
)
),
Stage::set(
product_name: Expression::stringFieldPath('product_mapping.name'),
product_category: Expression::stringFieldPath('product_mapping.category')
),

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

Stage::unset('_id', 'product_id', 'product_mapping')
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

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

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

php agg_tutorial.php
6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{
"customer_id": "elise_smith@myemail.com",
"orderdate": {
"$date": {
"$numberLong": "1590827752000"
}
},
"value": 431.43,
"product_name": "Asus Laptop",
"product_category": "ELECTRONICS"
}
{
"customer_id": "oranieri@warmmail.com",
"orderdate": {
"$date": {
"$numberLong": "1577867137000"
}
},
"value": 63.13,
"product_name": "Morphy Richardds Food Mixer",
"product_category": "KITCHENWARE"
}
{
"customer_id": "jjones@tepidmail.com",
"orderdate": {
"$date": {
"$numberLong": "1608972946000"
}
},
"value": 429.65,
"product_name": "Asus Laptop",
"product_category": "ELECTRONICS"
}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

pipeline.append(
{
"$match": {
"orderdate": {
"$gte": datetime(2020, 1, 1, 0, 0, 0),
"$lt": datetime(2021, 1, 1, 0, 0, 0),
}
}
}
)
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

pipeline.append(
{
"$lookup": {
"from": "products",
"localField": "product_id",
"foreignField": "id",
"as": "product_mapping",
}
}
)
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

pipeline.extend(
[
{"$set": {"product_mapping": {"$first": "$product_mapping"}}},
{
"$set": {
"product_name": "$product_mapping.name",
"product_category": "$product_mapping.category",
}
},
]
)

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

pipeline.append({"$unset": ["_id", "product_id", "product_mapping"]})
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

aggregation_result = orders_coll.aggregate(pipeline)

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

python3 agg_tutorial.py
6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{'customer_id': 'elise_smith@myemail.com', 'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52), 'value': 431.43, 'product_name': 'Asus Laptop', 'product_category': 'ELECTRONICS'}
{'customer_id': 'oranieri@warmmail.com', 'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37), 'value': 63.13, 'product_name': 'Morphy Richardds Food Mixer', 'product_category': 'KITCHENWARE'}
{'customer_id': 'jjones@tepidmail.com', 'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46), 'value': 429.65, 'product_name': 'Asus Laptop', 'product_category': 'ELECTRONICS'}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

{
"$match": {
orderdate: {
"$gte": DateTime.parse("2020-01-01T00:00:00Z"),
"$lt": DateTime.parse("2021-01-01T00:00:00Z"),
},
},
},
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

{
"$lookup": {
from: "products",
localField: "product_id",
foreignField: "id",
as: "product_mapping",
},
},
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

{
"$set": {
product_mapping: { "$first": "$product_mapping" },
},
},
{
"$set": {
product_name: "$product_mapping.name",
product_category: "$product_mapping.category",
},
},

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

{ "$unset": ["_id", "product_id", "product_mapping"] },
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

aggregation_result = orders.aggregate(pipeline)

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

ruby agg_tutorial.rb
6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{"customer_id"=>"elise_smith@myemail.com", "orderdate"=>2020-05-30 08:35:52 UTC, "value"=>431.43, "product_name"=>"Asus Laptop", "product_category"=>"ELECTRONICS"}
{"customer_id"=>"oranieri@warmmail.com", "orderdate"=>2020-01-01 08:25:37 UTC, "value"=>63.13, "product_name"=>"Morphy Richardds Food Mixer", "product_category"=>"KITCHENWARE"}
{"customer_id"=>"jjones@tepidmail.com", "orderdate"=>2020-12-26 08:55:46 UTC, "value"=>429.65, "product_name"=>"Asus Laptop", "product_category"=>"ELECTRONICS"}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

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

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

pipeline.push(doc! {
"$lookup": {
"from": "products",
"localField": "product_id",
"foreignField": "id",
"as": "product_mapping"
}
});
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

pipeline.push(doc! {
"$set": {
"product_mapping": { "$first": "$product_mapping" }
}
});
pipeline.push(doc! {
"$set": {
"product_name": "$product_mapping.name",
"product_category": "$product_mapping.category"
}
});

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

pipeline.push(doc! {
"$unset": ["_id", "product_id", "product_mapping"]
});
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

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

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

cargo run
6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

Document({"customer_id": String("elise_smith@myemail.com"), "order_date": DateTime(2020-05-30 8:35:52.0 +00:00:00),
"value": Double(431.42999267578125), "product_name": String("Asus Laptop"), "product_category": String("ELECTRONICS")})
Document({"customer_id": String("oranieri@warmmail.com"), "order_date": DateTime(2020-01-01 8:25:37.0 +00:00:00),
"value": Double(63.130001068115234), "product_name": String("Morphy Richardds Food Mixer"), "product_category": String("KITCHENWARE")})
Document({"customer_id": String("jjones@tepidmail.com"), "order_date": DateTime(2020-12-26 8:55:46.0 +00:00:00),
"value": Double(429.6499938964844), "product_name": String("Asus Laptop"), "product_category": String("ELECTRONICS")})

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

1

2020에 접수된 주문과 일치하는 $match 단계를 추가합니다.

Aggregates.filter(Filters.and(
Filters.gte("orderdate", dateFormat.parse("2020-01-01T00:00:00")),
Filters.lt("orderdate", dateFormat.parse("2021-01-01T00:00:00"))
)),
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션 의 product_id 필드 products 컬렉션 의 id 필드 에 조인합니다.

Aggregates.lookup(
"products",
"product_id",
"id",
"product_mapping"
),
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

Aggregates.set(Field("product_mapping", Document("$first" -> "$product_mapping"))),
Aggregates.set(
Field("product_name", "$product_mapping.name"),
Field("product_category", "$product_mapping.category")
),

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서 에 배열 요소를 하나만 추가합니다. 파이프라인 $first 연산자 사용하여 이 요소에서 데이터를 조회 .

4

마지막으로 $unset 단계를 추가합니다. $unset 단계에서는 문서 에서 불필요한 필드를 제거합니다.

Aggregates.unset("_id", "product_id", "product_mapping")
5

orders collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

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

마지막으로 IDE에서 애플리케이션 실행 .

6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{"customer_id": "elise_smith@myemail.com", "orderdate": {"$date": "2020-05-30T12:35:52Z"}, "value": 431.43, "product_name": "Asus Laptop", "product_category": "ELECTRONICS"}
{"customer_id": "oranieri@warmmail.com", "orderdate": {"$date": "2020-01-01T13:25:37Z"}, "value": 63.13, "product_name": "Morphy Richardds Food Mixer", "product_category": "KITCHENWARE"}
{"customer_id": "jjones@tepidmail.com", "orderdate": {"$date": "2020-12-26T13:55:46Z"}, "value": 429.65, "product_name": "Asus Laptop", "product_category": "ELECTRONICS"}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

돌아가기

배열 풀기

이 페이지의 내용