Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

ビューを使用して 2 つのコレクションを結合

項目一覧

  • 結合ビューの作成
  • ビューをクエリする

$lookup を使用して 2 つのコレクションのビューを作成し、そのビューに対してクエリを実行できます。アプリケーションは、複雑なパイプラインを構築または維持することなく、ビューに対してクエリを実行できます。

inventoryorders の 2 つのサンプル コレクションを作成します。

db.inventory.insertMany( [
{ prodId: 100, price: 20, quantity: 125 },
{ prodId: 101, price: 10, quantity: 234 },
{ prodId: 102, price: 15, quantity: 432 },
{ prodId: 103, price: 17, quantity: 320 }
] )
db.orders.insertMany( [
{ orderId: 201, custid: 301, prodId: 100, numPurchased: 20 },
{ orderId: 202, custid: 302, prodId: 101, numPurchased: 10 },
{ orderId: 203, custid: 303, prodId: 102, numPurchased: 5 },
{ orderId: 204, custid: 303, prodId: 103, numPurchased: 15 },
{ orderId: 205, custid: 303, prodId: 103, numPurchased: 20 },
{ orderId: 206, custid: 302, prodId: 102, numPurchased: 1 },
{ orderId: 207, custid: 302, prodId: 101, numPurchased: 5 },
{ orderId: 208, custid: 301, prodId: 100, numPurchased: 10 },
{ orderId: 209, custid: 303, prodId: 103, numPurchased: 30 }
] )

このコマンドは、db.createView() を使用し、 orders コレクションに基づいて sales という名前の新しいビューを作成します。

db.createView( "sales", "orders", [
{
$lookup:
{
from: "inventory",
localField: "prodId",
foreignField: "prodId",
as: "inventoryDocs"
}
},
{
$project:
{
_id: 0,
prodId: 1,
orderId: 1,
numPurchased: 1,
price: "$inventoryDocs.price"
}
},
{ $unwind: "$price" }
] )

この例では、次のことが行われます。

  • $lookup ステージでは、orders コレクションの prodId フィールドを使用して、一致する prodId フィールドを持つ inventory コレクション内のドキュメントを「結合」します。

  • 一致するドキュメントは、inventoryDocs フィールドに配列として追加されます。

  • $project ステージでは、使用可能なフィールドのサブセットが選択されます。

  • $unwind ステージでは、price フィールドを配列からスカラー値に変換します。

sales ビューのドキュメントは以下のとおりです。

{ orderId: 201, prodId: 100, numPurchased: 20, price: 20 },
{ orderId: 202, prodId: 101, numPurchased: 10, price: 10 },
{ orderId: 203, prodId: 102, numPurchased: 5, price: 15 },
{ orderId: 204, prodId: 103, numPurchased: 15, price: 17 },
{ orderId: 205, prodId: 103, numPurchased: 20, price: 17 },
{ orderId: 206, prodId: 102, numPurchased: 1, price: 15 },
{ orderId: 207, prodId: 101, numPurchased: 5, price: 10 },
{ orderId: 208, prodId: 100, numPurchased: 10, price: 20 },
{ orderId: 209, prodId: 103, numPurchased: 30, price: 17 }

各製品の合計販売金額を見つけるには、ビューをクエリします。

db.sales.aggregate( [
{
$group:
{
_id: "$prodId",
amountSold: { $sum: { $multiply: [ "$price", "$numPurchased" ] } }
}
}
] )

出力は次のとおりです。

[
{ _id: 102, amountSold: 90 },
{ _id: 101, amountSold: 150 },
{ _id: 103, amountSold: 1105 },
{ _id: 100, amountSold: 600 }
]

戻る

オンデマンドのマテリアライズドビュー