MongoDB

MongoDB左結合:包括的なガイド

Spread the love

目次

左結合とMongoDBのアプローチについて

SQLデータベースでは、左結合は左側のテーブルのすべての行を結果セットに含めることを保証します。右側のテーブルに一致する行が存在する場合は、対応するデータが結合されます。存在しない場合は、右側のフィールドはNULL値で埋められます。MongoDBはNoSQLデータベースであるため、「LEFT JOIN」コマンドは直接ありません。しかし、集計フレームワーク内の強力な$lookup演算子を使用して、同じ機能を実現できます。

$lookup演算子の習得

$lookup演算子は、指定されたフィールドに基づいて2つのコレクションのドキュメントを結合します。「左」コレクションのすべてのドキュメントは、「右」コレクションに一致が見つかるかどうかに関係なく返されることに注意することが重要です。構文を見てみましょう。


db.collection1.aggregate([
  {
    $lookup: {
      from: "collection2",       // 右側のコレクション
      localField: "field1",     // 一致のためのcollection1のフィールド
      foreignField: "field2",    // 一致のためのcollection2のフィールド
      as: "results"              // 一致したドキュメントを保持する配列フィールド
    }
  }
])

2つのコレクション、customersordersを考えます。

customersコレクション:

_id name city
1 John Doe New York
2 Jane Smith London
3 Peter Jones Paris

ordersコレクション:

_id customer_id amount
1 1 100
2 1 200
3 2 50

左結合を実行するには、$lookupを使用します。


db.customers.aggregate([
  {
    $lookup: {
      from: "orders",
      localField: "_id",
      foreignField: "customer_id",
      as: "orders"
    }
  }
])

これにより、すべての顧客が返されます。注文のある顧客にはorders配列が入力され、注文のない顧客には空の配列が入力されます。

フィルタリングによる結果の絞り込み

$matchステージでは、結合後のフィルタリングが可能です。たとえば、100ドルを超える注文のある顧客を見つけるには、次のようになります。


db.customers.aggregate([
  {
    $lookup: { /* ... (上記の$lookupと同じ) ... */ }
  },
  {
    $match: {
      "orders.amount": { $gt: 100 }
    }
  }
])

高度な集計テクニック

集計パイプラインの柔軟性は、$lookup$matchだけではありません。$unwind(配列を分解するため)、$group(データをまとめるため)、$sort(結果を並べ替えるため)などのステージを組み合わせて、複雑なデータ変換を行うことができます。たとえば、各顧客の総支出を計算するには、次のようになります。


db.customers.aggregate([
  {
    $lookup: { /* ... (上記の$lookupと同じ) ... */ }
  },
  { $unwind: "$orders" },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      totalSpent: { $sum: "$orders.amount" }
    }
  }
])

パフォーマンスの最適化

大規模なデータセットの場合、パフォーマンスが最も重要です。localFieldforeignFieldで使用されるフィールドにインデックスを作成することが重要です。効率的なインデックス作成は、結合操作を大幅に高速化します。集計パイプラインを分析して、不要なステージを排除し、クエリ効率を最適化します。

よくある質問

Q: field1またはfield2に複数のマッチがある場合はどうなりますか? A: $lookupは、results配列に一致するすべてのドキュメントを返します。各ドキュメントを個別に処理するには、$unwindを使用します。

Q: RIGHT JOINを実行できますか? A: 直接はできません。$lookupのコレクションを反転し、一致しないドキュメントを適切に処理します。

Q: 大規模なコレクションのパフォーマンスをどのように処理しますか? A: インデックス作成が不可欠です。パイプラインを最適化して処理を最小限に抑えます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です