문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

뷰를 사용하여 두 컬렉션에 참여

이 페이지의 내용

  • 예제
  • 조인된 뷰 만들기
  • 뷰 쿼리

$lookup 사용하여 두 컬렉션에 대한 뷰를 만든 다음 해당 뷰에 대해 쿼리를 실행할 수 있습니다. 애플리케이션은 복잡한 파이프라인을 구성하거나 유지 관리할 필요 없이 뷰를 쿼리할 수 있습니다.

두 개의 샘플 컬렉션 inventoryorders를 만듭니다.

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 }
]
← 뷰 만들기 및 쿼리