のセクションである、参照しているマニュアルセクションのドキュメントは非常に明確です。データベース参照 。これを理解する上で最も重要な部分は、ページの冒頭陳述に含まれています:
詳細については、可能性があるというトピックを取り上げています。 別のコレクションに保存しているデータへのアクセスを処理することを選択します。
DBRefがあります あまり詳細に立ち入ることなく、可能性がある仕様 これらがドキュメントで見つかったときに、参照されたドキュメントを現在のドキュメントに自動的に取得(拡張)する方法として、一部のドライバーに実装されます。これは、その_idのドキュメントに対するそのコレクションへの別のクエリを使用して「舞台裏」で実装されます。
手動リファレンスの場合 これは基本的に、コンテンツとして ObjectIdを持つフィールドがドキュメント内にあることを意味します。 別のドキュメントから。これは、DBRefとは決してないものとしてのみ異なります。 ベースドライバの実装によって処理されるのは、他のドキュメントのそれ以上の取得をどのように処理するかはあなた次第です。
次の場合:
> db.collection.findOne()
{
_id: <ObjectId>,
name: "This",
something: "Else",
ref: <AnotherObjectId>
}
ref
ドキュメントのフィールドは単なるObjectIdにすぎず、特別なことは何もしません。これにより、独自のクエリを送信して、参照するオブジェクトの詳細を取得できます。
> db.othercollection.findOne({ _id: <AnotherObjectId > })
{
_id: <ObjectId>
name: "That"
something: "I am a sub-document to This!"
}
このすべてのプロセスは、ドライバーAPIを介してクライアント側で行われることに注意してください。いずれの場合も、この他のドキュメントのフェッチはサーバー上では発生しません。