뷰를 사용하여 두 컬렉션에 참여
$lookup
을 사용하여 두 컬렉션에 대한 뷰를 만든 다음 해당 뷰에 대해 쿼리를 실행할 수 있습니다. 애플리케이션은 복잡한 파이프라인을 구성하거나 유지 관리할 필요 없이 뷰를 쿼리할 수 있습니다.
예시
두 개의 샘플 컬렉션 inventory
및 orders
를 만듭니다.
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
필드를 사용하여inventory
컬렉션에서 일치하는prodId
필드를 가진 문서를 조인합니다.일치하는 문서는
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 } ]