ほとんどの MongoDB のユースケースでは、非正規化データモデルは関連データを単一のドキュメントに保存します。場合によっては、関連情報を別個のドキュメント(通常は別個のコレクションまたはデータベース)に保存する必要がある場合があります。
重要
$lookup パイプライン ステージを使用して、同じデータベース内のシャーディングされていないコレクションへの左外部結合を実行できます。
また、パイプライン ステージ $graphLookup を使用して、シャーディングされていないコレクションを結合して再帰検索を実行することもできます。
このページでは、パイプライン ステージ $lookupおよび$graphLookup に先行する代替手順について説明します。
MongoDB アプリケーションは、ドキュメントの関連付けのために下記の 2 つの方法のいずれかを使用します。
DBRef は、最初のドキュメントの
_idフィールドの値、コレクション名、および任意でそのデータベース名とその他のフィールドの値を使用して、あるドキュメントから別のドキュメントへの参照です。アプリケーションでDBRefs を明示的に使用する必要がある場合を除き、代わりに手動参照を使用します。
手動参照
バックグラウンド
手動参照には、あるドキュメントの _idフィールドが別のドキュメントに含まれます。その後、アプリケーションは必要に応じて 2 番目のクエリを実行して、参照されたフィールドを解決できます。
MongoDB Atlas UIでの手動参照の作成
MongoDB Atlas の UI で手動参照を作成するには、次の手順に従います。
MongoDB Atlas UI で、プロジェクトの Clusters ページに移動します。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。
サイドバーで、 Database見出しの下のClustersをクリックします。
[ Clusters (クラスター) ] ページが表示されます。
places のエントリを参照するドキュメントを people のコレクションに追加します。
左側のナビゲーション ペインで別のコレクションを選択します。この例では
peopleコレクションを参照します。[Insert Document] をクリックします。
JSON ビュー アイコン ( {{}} ) をクリックします。
以下のデータをドキュメントに貼り付けます。
{ "_id": { "$oid": "651aebeb70299b120736f443" }, "name": "Erin", "places_id": { "$oid": "651aea5870299b120736f442" }, "url": "bc.example.net/Erin" } [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 つのドキュメントの関係の保存が必要なほとんどの場合に、 手動参照 を使用します。作成は簡単で、アプリケーションは必要に応じて解決できます。
DBRefs
バックグラウンド
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 を使用する場合は必ず上記の順序に従う必要があります。
DBRefs のドライバー サポート
ドライバー | DBRef のサポート | ノート |
|---|---|---|
C | サポートなし | 参照を手動で走査できます。 |
C++ | サポートなし | 参照を手動で走査できます。 |
C# | サポートあり | 詳細については、.NET/C# ドライバーのページを参照してください。 |
Go | サポートなし | 参照を手動で走査できます。 |
Haskell | サポートなし | 参照を手動で走査できます。 |
Java | サポートあり | Javaドライバーのページ を参照してください。 |
Node.js | サポートあり | 詳細については、 Node.jsドライバー ページ を参照してください。 |
Perl | サポートあり | 詳細についてはPerlドライバーのページを参照してください。 |
PHP | サポートなし | 参照を手動で走査できます。 |
Python | サポートあり | PyMongoドライバーのページ を参照してください。 |
Ruby | サポートあり | 詳細についてはRubyドライバーのページ を参照してください。 |
Scala | サポートなし | 参照を手動で走査できます。 |