$lookup 操作の削減
$lookup
演算子は、複数のコレクションの情報を結合して 1 つのドキュメントにします。 $lookup
操作は使用頻度が低い場合は便利ですが、 単一のコレクションのみをクエリする操作と比較して低速でリソースを集中的に消費する可能性があります。 $lookup
操作を頻繁に使用する場合は、関連データを 1 つのコレクションに保存するようにスキーマを再構築することを検討してください。 これにより、クエリのパフォーマンスが向上し、操作コストが削減されます。
このタスクについて
products
とorders
の 2 つの個別のコレクションを持つ次のスキーマを考えてみましょう。 各注文には複数の製品を含めることができ、各注文内で製品の詳細を追跡して、すばやくアクセスできるようにしたいと考えています。 2 つの個別のコレクションは$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
操作の使用を減らすには、まとめてアクセスされるデータを 1 つのコレクションに保存します。
例
サブセットスキーマ設計パターンを使用して、製品の詳細のサブセットを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
コレクションに埋め込むことで、複数のクエリを回避しながらコレクションを分離できます。 これにより、読み取りパフォーマンスが向上し、データ検索が簡素化されます。これにより、1 回のクエリで必要な情報にすべてアクセスできるようになります。 ただし、潜在的なドキュメントサイズの制限とデータの重複を考慮することが重要です。