ビューを使用して 2 つのコレクションを結合
$lookup
を使用して 2 つのコレクションのビューを作成し、そのビューに対してクエリを実行できます。アプリケーションは、複雑なパイプラインを構築または維持することなく、ビューに対してクエリを実行できます。
例
inventory
とorders
の 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 } ]