$lookup 작업 줄이기
$lookup
연산자 는 여러 컬렉션의 정보를 단일 문서 로 결합합니다. $lookup
작업은 자주 사용하지 않을 때 유용하지만, 단일 컬렉션 만 쿼리 하는 작업에 비해 속도가 느리고 리소스 집약적일 수 있습니다. $lookup
작업을 자주 사용하는 경우 관련 데이터를 단일 컬렉션 에 저장 하도록 스키마 를 재구성하는 것이 좋습니다. 이렇게 하면 쿼리 성능이 향상되고 운영 비용 이 절감될 수 있습니다.
이 작업에 대하여
두 개의 개별 컬렉션이 있는 다음 스키마 를 가정해 보겠습니다: products
및 orders
. 각 주문에는 여러 제품이 포함될 수 있으며, 각 주문의 제품 세부 정보를 추적 하여 빠르게 액세스. 두 개의 개별 컬렉션은 $lookup
작업으로 결합됩니다.
//products collection db.products.insertMany( [ { _id: 1, name: "Laptop", price: 1000, manufacturer: "TechCorp", category: "Electronics", description: "Fastest computer on the market." }, { _id: 2, name: "Headphones", price: 100, manufacturer: "Sound", category: "Accessories", description: "The latest sound technology." }, { _id: 3, name: "Tablet", price: 200, manufacturer: "TechCorp", category: "Electronics", description: "The most compact tablet." } ] )
//orders collection db.orders.insertMany( [ { _id: 101, customer_name: "John Doe", timestamp: "2024-05-11T010:00:00Z", product_ids: [1, 2], total: 1200 }, { _id: 102, customer_name: "Jane Smith", timestamp: "2024-05-11T012:00:00Z", product_ids: [2], total: 100 } ] )
이 스키마 에서는 주문 정보에 액세스 때마다 $lookup
작업을 사용해야 합니다. $lookup
작업을 실행하면 쿼리 복잡성이 증가하고 성능이 저하됩니다. $lookup
작업의 사용을 줄이려면 액세스하는 데이터를 단일 컬렉션 에 저장 합니다.
예시
하위 집합 스키마 설계 패턴 을 사용하여 orders
컬렉션 에 제품 세부 정보의 하위 집합을 포함할 수 있습니다. 이를 통해 단일 컬렉션 을 쿼리 하여 필요한 결과를 반환할 수 있습니다. orders
컬렉션 과 관련이 없는 제품 세부 정보 및 문서는 products
컬렉션 에 남아 있습니다.
//orders collection db.orders.insertMany( [ { _id: 101, customer_name: "John Doe", timestamp: "2024-05-11T10:00:00Z", products: [ { product_id: 1, name: "Laptop", price: 1000 }, { product_id: 2, name: "Headphones", price: 100 } ], total: 1100 }, { _id: 102, customer_name: "Jane Smith", timestamp: "2024-05-11T12:00:00Z", products: [ { product_id: 2, name: "Headphones", price: 100 } ], total: 100 } ] )
//products collection db.products.insertMany( [ { _id: 1, name: "Laptop", price: 1000, manufacturer: "TechCorp", category: "Electronics", description: "Fastest computer on the market." }, { _id: 2, name: "Headphones", price: 100, manufacturer: "Sound", category: "Accessories", description: "The latest sound technology." }, { _id: 3, name: "Tablet", price: 200, manufacturer: "TechCorp", category: "Electronics", description: "The most compact tablet." } ] )
이 접근 방식을 사용하면 product
컬렉션 의 키 필드를 orders
컬렉션 에 포함하여 여러 쿼리를 피하면서 컬렉션을 별도로 유지할 수 있습니다. 이렇게 하면 단일 쿼리 에서 필요한 모든 정보에 액세스 할 수 있으므로 읽기 성능이 향상되고 데이터 검색이 간소화됩니다. 그러나 잠재적인 문서 크기 제한과 데이터 중복을 고려하는 것이 중요합니다.