Node.jsとMongoDBで複数のデータを結びつけて取得する方法

node-mongodb-lookup
  • URLをコピーしました!

日々の開発で扱うデータベースには、1つの情報だけでなく、別の情報と関係を持つデータが存在することがよくあります。

たとえば、「ある人がいつどこで何をしたか」といった記録を持つデータと、「その場所に関する詳細情報」を別のデータとして管理しているようなケースです。

こうした複数の情報を一緒に扱いたい場合、結びつけてまとめて取り出す処理が必要になります。この記事では、Node.jsMongoDB互換データベースを使って、その基本的なやり方を丁寧に説明します。

目次

どんなことができるのか

以下のような情報を考えてみましょう。

  • 行動履歴の記録(誰が、いつ、どこで、何をしたか)
  • 場所の情報(名前、住所、連絡先など)

この2つの情報は別々のデータの集まりコレクション)として保管されています。

行動履歴の中には、「場所のID」だけが記録されていますが、そのIDをもとにして、実際の場所の名前や連絡先を取り出すことができます。

このように「ある情報の一部を使って、別の情報から詳細を引き出す」ことを行う操作が、本記事のテーマです。

結びつけて取り出すための考え方

MongoDBでは、複数のコレクションを$lookupという命令で結びつけ(関連付け)ることができます。
以下のような流れになります。

  1. もとになるデータから必要なものを選ぶ(例:特定の人の行動記録)
  2. 結びつけたいデータをIDなどで関連付ける(例:場所の情報)
  3. 必要な項目だけを選んで表示する

この流れを、Node.jsを使って実現する例を次に紹介します。

実際の処理の書き方

以下は、2つのコレクションから情報を結びつけて取り出すNode.jsのプログラム例です。

const { MongoClient, ObjectId } = require('mongodb');

async function main() {
    const uri = '接続先のアドレス'; // データベース接続情報
    const client = new MongoClient(uri);

    try {
        await client.connect();

        const database = client.db('データベース名');
        const history = database.collection('履歴データ');
        const locations = database.collection('場所データ');

        const personId = ObjectId('対象となる利用者のID');

        const result = await history.aggregate([
            {
                $match: { 利用者ID: personId } // 特定の人の記録だけを選ぶ
            },
            {
                $lookup: {
                    from: '場所データ',        // 結びつけたいコレクション名
                    localField: '場所ID',     // 履歴データ内のID項目
                    foreignField: '_id',       // 場所データのID項目
                    as: '場所情報'             // 結びついた情報の入る名前
                }
            },
            {
                $unwind: '$場所情報'          // 複数あった場合に1つずつに分ける
            },
            {
                $project: {
                    行動日時: '$日時',
                    場所名: '$場所情報.名前',
                    画像URL: '$場所情報.画像'
                }
            }
        ]).toArray();

        console.log(result);
    } finally {
        await client.close();
    }
}

main().catch(console.error);

この例では、「履歴データ」と「場所データ」という2つの情報をIDで結びつけて、必要な項目だけを表示する処理を行っています。
特に次の部分が重要です。

  • $lookup:他の情報と関連づける命令
  • $unwind:結びついた情報が複数ある場合に展開する命令
  • $project:表示したい項目を指定する命令

出力される結果のイメージ

[
  {
    "行動日時": "2025-06-18T08:45:40.166Z",
    "場所名": "中央公園前店",
    "画像URL": "https://example.com/image.jpg"
  }
]

このように、最初のデータには含まれていなかった「場所名」や「画像のURL」が、別のデータと結びつけられることで取り出せるようになります。

いろいろな応用例

この方法は、さまざまな場面で使えます。

  • 買い物の履歴商品情報の関連付け
  • 予約記録施設情報の結びつけ
  • 学習記録教材データの組み合わせ

このように、ひとつのデータだけでは足りない情報を、他のデータとつなげて使うことができるのが結びつけの操作の大きな利点です。

まとめ

この記事では、Node.jsMongoDBを使って、複数のコレクションの情報を結びつけて取得する方法を紹介しました。

特定の条件でデータを選び、関連情報を別のコレクションから引き出すことで、データをよりわかりやすく整理して使うことができます。

この仕組みは、日常的な開発でもよく使われるものです。
ぜひ覚えておいて、情報を扱う場面で役立ててください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次