AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

複数フィールド結合の実行

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

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

この集計では、$lookup を使用して複数フィールド結合を実行します。複数結合フィールドは、2 つのコレクションのドキュメント内に対応するフィールドが複数ある場合に発生します。集計では、対応するフィールドでこれらのドキュメントを照合し、両方の情報を 1 つのドキュメントに結合します。


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


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

  • productsは、店舗が販売する商品を説明するドキュメントを含みます。

  • ordersは、店舗内の製品の個々の注文を説明するドキュメントを含みます

注文には1つの製品のみを含めることができます。集計では複数フィールド結合を使用して、製品ドキュメントを、その製品の注文を表すドキュメントと照合します。この集計は、 ordersコレクション内のドキュメントの product_name フィールドと product_variation フィールドに対応する、productsコレクション内のドキュメントの name フィールドと variation フィールドによってコレクションを結合します。

orders コレクションと products コレクションを作成するには、insertMany() メソッドを使用します。

db.orders.deleteMany({}) db.orders.insertMany( [ { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-05-30T08:35:52Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 431.43, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), product_name: "The Day Of The Triffids", product_variation: "2nd Edition", value: 5.01, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), product_name: "Morphy Richards Food Mixer", product_variation: "Deluxe", value: 63.13, }, { customer_id: "jjones@tepidmail.com", orderdate: new Date("2020-12-26T08:55:46Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 429.65, }] )
db.products.deleteMany({}) db.products.insertMany( [ { name: "Asus Laptop", variation: "Ultra HD", category: "ELECTRONICS", description: "Great for watching movies" }, { name: "Asus Laptop", variation: "Standard Display", category: "ELECTRONICS", description: "Good value laptop for students" }, { name: "The Day Of The Triffids", variation: "1st Edition", category: "BOOKS", description: "Classic post-apocalyptic novel" }, { name: "The Day Of The Triffids", variation: "2nd Edition", category: "BOOKS", description: "Classic post-apocalyptic novel" }, { name: "Morphy Richards Food Mixer", variation: "Deluxe", category: "KITCHENWARE", description: "Luxury mixer turning good cakes into great" }] )

次の手順は、集計パイプラインを作成して実行し、複数のフィールドのコレクションを結合する方法を示しています。

1

パイプラインの最初のステージは、各コレクションの 2 つのフィールドで ordersコレクションと productsコレクションに結合する $lookup ステージです。$lookup ステージには、結合を構成するための埋め込みパイプラインが含まれています。

embedded_pl = [ // Stage 1: Match the values of two fields on each side of the join // The $eq filter uses aliases for the name and variation fields set { $match: { $expr: { $and: [ { $eq: ["$product_name", "$$prdname"] }, { $eq: ["$product_variation", "$$prdvartn"] } ] } } }, // Stage 2: Match orders placed in 2020 { $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z") } } }, // Stage 3: Remove unneeded fields from the orders collection side of the join { $unset: ["_id", "product_name", "product_variation"] }]
2
db.products.aggregate( [ // Use the embedded pipeline in a lookup stage { $lookup: { from: "orders", let: { prdname: "$name", prdvartn: "$variation" }, pipeline: embedded_pl, as: "orders" } }, // Match products ordered in 2020 { $match: { orders: { $ne: [] } } }, // Remove unneeded fields { $unset: ["_id", "description"] }] )
3

集計された結果には 2 つのドキュメントが含まれます。ドキュメントは、2020 が注文した製品を表します。各ドキュメントには、その製品の各注文に関する詳細を一覧表示する orders 配列フィールドが含まれています。

{ name: 'Asus Laptop', variation: 'Standard Display', category: 'ELECTRONICS', orders: [ { customer_id: 'elise_smith@myemail.com', orderdate: ISODate('2020-05-30T08:35:52.000Z'), value: 431.43 }, { customer_id: 'jjones@tepidmail.com', orderdate: ISODate('2020-12-26T08:55:46.000Z'), value: 429.65 } ]}{ name: 'Morphy Richards Food Mixer', variation: 'Deluxe', category: 'KITCHENWARE', orders: [ { customer_id: 'oranieri@warmmail.com', orderdate: ISODate('2020-01-01T08:25:37.000Z'), value: 63.13 } ]}
言語の選択
このページを評価