Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

データベース参照

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

重要

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

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

  • 手動参照では、あるドキュメントの _id フィールドを別のドキュメントに参照として保存します。アプリケーションにより 2 つ目のクエリが実行され、関連データが返されます。これらの参照は簡単で、ほとんどのユースケースにおいて十分です。

  • DBRef は、最初のドキュメントの_id フィールド、コレクション名、および任意でそのデータベース名とその他のフィールドの値を使用して、あるドキュメントから別のドキュメントへの参照です。 DBRef を使用すると、複数のコレクションやデータベースに保存されているドキュメントを参照できます。

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

DBRef は、ドキュメント間の関係を表す共通の形式とタイプを提供します。また、この形式は、データベースが複数のフレームワークやツールを操作するときに、ドキュメント間のリンクを表現する共通のセマンティクスも提供します。

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": "651aea5870299b120736f442"
    "url": "bc.example.net/Erin"
    }
  5. [Insert] をクリックします。

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

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

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

original_id = ObjectId()
db.places.insertOne({
"_id": original_id,
"name": "Broadway Center",
"url": "bc.example.net"
})
db.people.insertOne({
"name": "Erin",
"places_id": original_id,
"url": "bc.example.net/Erin"
})

次に、クエリが people コレクションからドキュメントを返す際に、必要に応じて places コレクションの places_id フィールドで参照されたドキュメントに対して 2 回目のクエリを実行できます。

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

手動参照では、データベースとコレクション名は伝達されません。単一のコレクション内のドキュメントが複数のコレクションのドキュメントに関連付けられる場合は、 DBRef の使用を検討してください。

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

オプションとして、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#

サポートあり

Go

サポートなし

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

Haskell

サポートなし

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

Java

サポートあり

Node.js

サポートあり

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

Perl

サポートあり

PHP

サポートなし

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

Python

サポートあり

Ruby

サポートあり

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

Scala

サポートなし

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

2 つ以上の関連ドキュメントを接続するには、ほとんどの場合、 手動参照 を使用します。複数のコレクションからドキュメントを参照必要がある場合は、DBRefs の使用を検討してください。

戻る

参照データ

項目一覧