NodeJS 速習チュートリアル

Node.js MongoDB 結合 (Join)

1. コレクションの結合

MongoDBはリレーショナルデータベースではありませんが、$lookup ステージを使用することで、SQLの「レフトアウタージョイン(Left Outer Join)」に相当する処理を実行できます。

$lookup ステージでは、現在のコレクションと結合したいコレクション、および一致させるべきフィールドを指定します。

ここでは、例として「orders(注文)」コレクションと「products(製品)」コレクションがある場合を想定します。

orders コレクション

[
  { _id: 1, product_id: 154, status: 1 }
]

products コレクション

[
  { _id: 154, name: 'Chocolate Heaven' },
  { _id: 155, name: 'Tasty Lemons' },
  { _id: 156, name: 'Vanilla Dreams' }
]

1.1 実装例:「orders」コレクションに一致する「products」ドキュメントを結合する

let MongoClient = require('mongodb').MongoClient;
let url = "mongodb://127.0.0.1:27017/";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  let dbo = db.db("mydb");
  
  // aggregateメソッドを使用して結合処理を定義
  dbo.collection('orders').aggregate([
    { $lookup:
       {
         from: 'products',            // 結合先のコレクション名
         localField: 'product_id',     // 現在のコレクション(orders)のフィールド
         foreignField: '_id',          // 結合先コレクション(products)のフィールド
         as: 'orderdetails'            // 結合結果を格納する配列フィールド名
       }
     }
    ]).toArray(function(err, res) {
    if (err) throw err;
    // 結果をJSON形式で出力
    console.log(JSON.stringify(res));
    db.close();
  });
});

2. プログラムの実行と結果の確認

上記の内容を demo_mongodb_join.js というファイル名で保存し、実行してください。

demo_mongodb_join.js の実行

C:\Users\Your Name>node demo_mongodb_join.js

実行に成功すると、以下のような結果が得られます。

実行結果:

[
  { 
    "_id": 1, 
    "product_id": 154, 
    "status": 1, 
    "orderdetails": [
      { "_id": 154, "name": "Chocolate Heaven" }
    ]
  }
]

出力結果からわかるように、products コレクションから一致したドキュメントが、orders コレクション内のアレイ(配列)として統合されています。これにより、非正規化されたドキュメント指向DBにおいても、複雑なデータリレーションシップを効率的に扱うことが可能になります。