Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

$lookup 操作の削減

項目一覧

  • このタスクについて
  • 詳細

$lookup演算子は、複数のコレクションの情報を結合して 1 つのドキュメントにします。 $lookup操作は使用頻度が低い場合は便利ですが、 単一のコレクションのみをクエリする操作と比較して低速でリソースを集中的に消費する可能性があります。 $lookup操作を頻繁に使用する場合は、関連データを 1 つのコレクションに保存するようにスキーマを再構築することを検討してください。 これにより、クエリのパフォーマンスが向上し、操作コストが削減されます。

productsordersの 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 回のクエリで必要な情報にすべてアクセスできるようになります。 ただし、潜在的なドキュメントサイズの制限とデータの重複を考慮することが重要です。

戻る

肥大化した文書