AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

データベース参照: 手動参照と DBRefs

ほとんどの MongoDB のユースケースでは、非正規化データモデルは関連データを単一のドキュメントに保存します。場合によっては、関連情報を別個のドキュメント(通常は別個のコレクションまたはデータベース)に保存する必要がある場合があります。

重要

$lookup パイプライン ステージを使用して、同じデータベース内のシャーディングされていないコレクションへの左外部結合を実行できます。

また、パイプライン ステージ $graphLookup を使用して、シャーディングされていないコレクションを結合して再帰検索を実行することもできます。

このページでは、パイプライン ステージ $lookupおよび$graphLookup に先行する代替手順について説明します。

MongoDB アプリケーションは、ドキュメントの関連付けのために下記の 2 つの方法のいずれかを使用します。

  • _id手動参照では、あるドキュメントの フィールドを別のドキュメントに参照として保存します。アプリケーションにより 2 つ目のクエリが実行され、関連データが返されます。手動参照はほとんどのユースケースで機能するため、通常 DBRef よりも優先されます。

  • DBRef は、最初のドキュメントの_id フィールドの値、コレクション名、および任意でそのデータベース名とその他のフィールドの値を使用して、あるドキュメントから別のドキュメントへの参照です。アプリケーションでDBRefs を明示的に使用する必要がある場合を除き、代わりに手動参照を使用します。

手動参照には、あるドキュメントの _idフィールドが別のドキュメントに含まれます。その後、アプリケーションは必要に応じて 2 番目のクエリを実行して、参照されたフィールドを解決できます。

MongoDB Atlas の UI で手動参照を作成するには、次の手順に従います。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。

  3. サイドバーで、 Database見出しの下のClustersをクリックします。

    [ Clusters (クラスター) ] ページが表示されます。

2
  1. データベース参照を追加するクラスターで、 [ Browse Collections ] をクリックします。

  2. 左のナビゲーション ペインでデータベースをクリックします。

  3. 左のナビゲーション ペインでコレクションをクリックします。この例では places コレクションを参照します。

3
  1. [Insert Document] をクリックします。

  2. JSON ビュー アイコン ( {{}} ) をクリックします。

  3. 以下のデータをドキュメントに貼り付けます。

    {
    "_id": {
    "$oid": "651aea5870299b120736f442"
    },
    "name": "Broadway Center",
    "url": "bc.example.net"
    }
  4. [Insert] をクリックします。

4
  1. 左側のナビゲーション ペインで別のコレクションを選択します。この例では people コレクションを参照します。

  2. [Insert Document] をクリックします。

  3. JSON ビュー アイコン ( {{}} ) をクリックします。

  4. 以下のデータをドキュメントに貼り付けます。

    {
    "_id": {
    "$oid": "651aebeb70299b120736f443"
    },
    "name": "Erin",
    "places_id": {
    "$oid": "651aea5870299b120736f442"
    },
    "url": "bc.example.net/Erin"
    }
  5. [Insert] をクリックします。

    クエリが people コレクションのドキュメントを返す際に、必要であれば、places_id フィールドで参照されるドキュメントでの places コレクションからのクエリ結果をフィルタリングできます。

    MongoDB Atlas でクエリを実行する方法の詳細については、MongoDB Atlas ドキュメントのドキュメントの表示、フィルター処理、並べ替えを参照してください。

以下のように、1 つ目のドキュメントの _id フィールドを2 つ目のドキュメントの参照として使用して、2つのドキュメントを挿入する操作を考えてみましょう。

const original_id = db.movies.insertOne({
title: "Reference Demo Film 2099"
}).insertedId
db.comments.insertOne({
name: "Reference Demo Viewer",
movie_id: original_id,
text: "A thrilling adventure set in the future."
})

movie_idフィールドが参照するドキュメントを取得するには、moviesコレクション内のドキュメントに対して 2 つ目のクエリを実行します。

db.comments.findOne(
{ movie_id: original_id },
{ name: 1, text: 1, _id: 0 }
)
{
name: 'Reference Demo Viewer',
text: 'A thrilling adventure set in the future.'
}

2 つのドキュメントの関係の保存が必要なほとんどの場合に、 手動参照 を使用します。作成は簡単で、アプリケーションは必要に応じて解決できます。

DBRef は、特定の参照タイプというよりは、むしろドキュメントを表現するための規則です。DBRef には _id フィールドの値に加え、コレクション名、場合によってはデータベース名が含まれます。

オプションとして、DBRef には任意の数の他のフィールドを含めることができます。追加のフィールド名は、サーバーバージョンによって課せられているフィールド名の規則に従う必要があります。

DBRefs を解決するには、参照先のドキュメントが返されるよう、アプリケーションで追加のクエリが実行されなければなりません。一部のMongoDBドライバーでは、DBRef をドキュメントに変換するヘルパーメソッドが提供されていますが、解決は自動ではありません。

DBRef には、次のフィールドがあります。

$ref

$ref フィールドは、参照先のドキュメントが存在するコレクションの名前を保持します。

$id

$id フィールドは、参照先のドキュメントの _id フィールドの値を含みます。

$db

任意。

参照先のドキュメントが存在するデータベースの名前を含みます。

DBRef ドキュメントは下記のドキュメントに近似します。

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }

creator フィールドに DBRef を格納したコレクションのドキュメントを例にとります。

{
"_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
// .. application fields
"creator" : {
"$ref" : "creators",
"$id" : ObjectId("5126bc054aed4daf9e2ab772"),
"$db" : "users",
"extraField" : "anything"
}
}

この例の DBRef は、users データベースの creators コレクションにある、_id フィールドに ObjectId("5126bc054aed4daf9e2ab772") を持つドキュメントを指しています。さらに任意のフィールドも含まれています。

注意

DBRef 内のフィールドの順序は重要です。DBRef を使用する場合は必ず上記の順序に従う必要があります。

ドライバー
DBRef のサポート
ノート

C

サポートなし

参照を手動で走査できます。

C++

サポートなし

参照を手動で走査できます。

C#

サポートあり

詳細については、.NET/C# ドライバーのページを参照してください。

Go

サポートなし

参照を手動で走査できます。

Haskell

サポートなし

参照を手動で走査できます。

Java

サポートあり

Javaドライバーのページ を参照してください。

Node.js

サポートあり

詳細については、 Node.jsドライバー ページ を参照してください。

Perl

サポートあり

詳細についてはPerlドライバーのページを参照してください。

PHP

サポートなし

参照を手動で走査できます。

Python

サポートあり

PyMongoドライバーのページ を参照してください。

Ruby

サポートあり

Scala

サポートなし

参照を手動で走査できます。