Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/
データベース マニュアル
/ / /

1 対 1 結合の実行

このチュートリアルでは、集計パイプラインを構築し、コレクションに対して集計を実行し、選択した言語を使用して結果を表示する方法を説明します。

このチュートリアルでは、製品情報を記述するコレクションのデータと、カスタマーの注文を記述する別のコレクションのデータを組み合わせる方法を説明します。結果には 2020 で行われたすべての注文のリストが表示され、各注文に関連付けられた製品の詳細が含まれます。

この集計では 1 対 1 の結合が実行されます。 1 対 1 の結合は、1 つのコレクション内のドキュメントの フィールド値が、同じフィールド値を持つ別のコレクション内の単一のドキュメントと一致する場合に行われます。 集計は フィールド値でこれらのドキュメントを照合し、両方のソースからの情報を 1 つの結果に結合します。

注意

1 対 1 の結合では、ドキュメントに 1 対 1 の関係必要はありません。この データ関係の詳細については、 Wikipedia の 1 対 1(データモデル)に関するエントリを参照してください。


右上の[ 言語選択 ] ドロップダウンメニューを使用して、以下の例の言語を設定するか、 MongoDB Shell を選択します。


この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する product_idフィールドでコレクションを結合します。

orders コレクションと products コレクションを作成するには、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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールして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;
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 Cスタートガイドの接続文字列の作成ステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールして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;
}
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 C++を使い始める チュートリアルの接続文字列の作成ステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールして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);
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 C#クイック スタートガイドの「Atlas で無料階層クラスターを設定する」のステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する ProductIdフィールドでコレクションを結合します。

まず、orders コレクションと products コレクション内のデータをモデル化するためのC#クラスを作成します。

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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールしてMongoDBに接続する方法については、 Go Driver クイック スタートガイド を参照してください。

Go Driver で集計を実行する方法の詳細については、集計ガイドを参照してください。

ドライバーをインストールしたら、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))
}
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 Goクイック スタートガイドの「 MongoDBクラスターの作成 」ステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する product_idフィールドでコレクションを結合します。

まず、orders コレクションと products コレクション内のデータをモデル化するためのGo構造体を作成します。

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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールしてMongoDBに接続する方法については、Javaドライバーを使い始める のガイドを参照してください。

Java Sync Driver で集計を実行する方法の詳細については、 集計ガイドを参照してください。

ドライバーをインストールしたら、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());
}
}
}
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 Java同期クイック スタートガイドの接続文字列の作成の手順を参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールして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) }
}
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、Kotlinドライバー クイック スタートガイドのクラスターへの接続ステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する product_idフィールドでコレクションを結合します。

まず、orders コレクションと products コレクション内のデータをモデル化するためのKotlinデータ クラスを作成します。

@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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールして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);

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

デプロイメントの接続文字列を見つける方法については、 Node.jsクイック スタートガイドの接続文字列の作成のステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

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

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 「 PHPライブラリを使い始める 」チュートリアルの「 接続文字列の作成 」のステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

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

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 「 PHPライブラリを使い始める 」チュートリアルの「 接続文字列の作成 」のステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

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

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

デプロイメントの接続文字列を見つける方法については、 Rubyをはじめるガイドの「接続文字列の作成」ステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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デプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールして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(())
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

デプロイメントの接続文字列を見つける方法については、 Rustクイック スタートガイドの「 接続文字列の作成 」のステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する product_idフィールドでコレクションを結合します。

まず、orders コレクションと products コレクション内のデータをモデル化するためのRust構造体を作成します。

#[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?;

集計チュートリアルに従う前に、新しいScalaアプリを設定する必要があります。このアプリを使用して、 MongoDBデプロイに接続し、サンプルデータをMongoDBに挿入し、集計パイプラインを実行できます。

Tip

ドライバーをインストールしてMongoDBに接続する方法については、 Scalaドライバーを使い始める ガイドを参照してください。

Scalaドライバーで集計を実行する方法の詳細については、集計ガイドを参照してください。

ドライバーをインストールしたら、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()
}
}

すべてのチュートリアルで、接続stringプレースホルダーを配置の接続stringに置き換える必要があります。

Tip

配置の接続文字列を見つける方法については、 Scalaドライバーの使用開始ガイドの「 接続文字列の作成 」のステップを参照してください。

たとえば、接続stringが "mongodb+srv://mongodb-example:27017" の場合、接続stringの割り当ては次のようになります。

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

この例では、2 つのコレクションを使用します。

  • orders: 店舗内の商品の個々の注文を説明するドキュメント

  • products: 店舗が販売する商品を説明するドキュメント

注文には1つの製品のみを含めることができます。この集計では 1 対 1 の結合を使用して、注文ドキュメントを対応する 製品ドキュメントと照合します。この集計では、両方のコレクションのドキュメントに存在する 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 ステージは常に 1 つのドキュメントを含む product_mapping 配列を出力します。$lookupステージの後の $set ステージでは、$first を使用して product_mapping 配列からドキュメントが抽出されます。このパイプラインを、$lookup ステージが複数のドキュメントの配列を出力する設定で使用する場合は、$lookup ステージで明示的な { $limit: 1 } ステージを使用することを検討してください。

注意

foreignField に対応するインデックスが存在しない場合、単一結合で等価一致を実行する $lookup操作はパフォーマンスが低下する可能性があります。詳細については、 および 「検索パフォーマンスに関する考慮事項とインデックスの作成」 を参照してください。

2

集計された結果には 3 つのドキュメントが含まれます。ドキュメントは、注文製品の 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'
}

結果は、各元のドキュメントに存在する product_idフィールドを一致させることで結合された ordersコレクションと 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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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"),
"}", "}",

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

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

Tip

上記のコマンドを 1 回の呼び出しで実行中て接続エラーが発生した場合は、個別に実行できます。

6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $addFields ステージを追加します。

最初の$addFieldsステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$addFieldsステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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"
})"));

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

auto cursor = orders.aggregate(pipeline);

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

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

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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 の 2 つの新しいフィールドが作成されます。このステージでは、出力ドキュメントに含めるフィールドと除外するフィールドも指定します。

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

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、IDE でアプリケーションを実行し、結果を調べます。

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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"},
}}}

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

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

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

go run agg_tutorial.go
6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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")
));

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

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

最後に、アプリケーションを IDE で実行します。

6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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")
)
)

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

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

最後に、アプリケーションを IDE で実行します。

6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( product_nameproduct_category )が作成されます。

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

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

const aggregationResult = await orders.aggregate(pipeline);

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

node agg_tutorial.js
6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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')
),

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

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

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

php agg_tutorial.php
6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( product_nameproduct_category )が作成されます。

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

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

aggregation_result = orders_coll.aggregate(pipeline)

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

python3 agg_tutorial.py
6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( product_nameproduct_category )が作成されます。

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

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

aggregation_result = orders.aggregate(pipeline)

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

ruby agg_tutorial.rb
6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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"
}
});

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

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

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

cargo run
6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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

次に、パイプラインに 2 つの $set ステージを追加します。

最初の$setステージは、 product_mappingフィールドを、前の$lookupステージで作成されたproduct_mappingオブジェクトの最初の要素に設定します。

2 つ目の$setステージでは、 product_mappingオブジェクト フィールドの値から 2 つの新しいフィールド ( 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")
),

Tip

これは 1 対 1 の結合であるため、$lookup ステージは入力ドキュメントに配列要素を 1 つだけ追加します。パイプラインは$first 演算子を使用して、この要素からデータを検索します。

4

最後に、$unset ステージを追加します。$unset ステージは、ドキュメントから不要なフィールドを排除します。

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

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

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

最後に、アプリケーションを IDE で実行します。

6

集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、注文製品の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フィールドを一致させて結合されます。

戻る

配列の展開

項目一覧