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においても、複雑なデータリレーションシップを効率的に扱うことが可能になります。