埋め込みドキュメントは、関連するデータを単一のドキュメント構造にストアします。ドキュメントには、関連データを持つ配列とサブドキュメントを含めることができます。これらの非正規化されたデータモデルにより、アプリケーションは 1 回のデータベース操作で関連データを検索できます。
次の例では、contact フィールドと access フィールドは埋め込みドキュメントです。
埋め込みデータモデルは、頻繁にアクセスされるデータが複数のコレクションに重複するため、多くの場合、非正規化されていると見なされます。
埋め込みデータモデルを使用すると、アプリケーションは同じデータベースレコード内の関連情報をクエリできます。その結果、埋め込みには次のメリットが得られます。
読み取り操作のパフォーマンス向上
1 回のデータベース操作で関連データを取得できる
1 回のアトミックな書き込み操作で関連データを更新できる
埋め込みドキュメントは、関連するデータを単一のドキュメント構造にストアします。ドキュメントには、関連データを持つ配列とサブドキュメントを含めることができます。これらの非正規化されたデータモデルにより、アプリケーションは 1 回のデータベース操作で関連データを検索できます。
ユースケース
埋め込みデータモデルは、以下のシナリオで使用します。
エンティティ間に「含む」の関係がある場合。たとえば、
addressを含むcontactsドキュメントがこれに当たります。「埋め込みドキュメントによる 1 対 1 の関係のモデル化」を参照してください。エンティティ間に1対多の関係がある場合。これらの関係では、「多数」または子ドキュメントが「1 つ」または親ドキュメントに関連して表示されます。「埋め込みドキュメントによる 1 対多の関係のモデル化」を参照してください。
多数の小さなドキュメントを含むコレクション
多数の小さなドキュメントを含むコレクションがある場合は、パフォーマンスを向上させるために 埋め込み を検討してください。これらの小さなドキュメントを何らかの論理的な関係でグループ化し、このグループ化でドキュメントを頻繁に検索する場合は、埋め込みドキュメントの配列を含む大きなドキュメントに、小さなドキュメントを「ロールアップ」することを検討してください。
これらの小さなドキュメントを論理グループに「ロールアップ」するということは、ドキュメントのグループを取得するためのクエリに含まれる順次読み取りで、ランダムなディスク アクセスが少なくなります。 さらに、ドキュメントを「ロールアップ」し、共通フィールドを大きなドキュメントに移動することは、これらのフィールドのインデックスにメリットをもたらす。 共通フィールドのコピーが少なくなり、対応するインデックス内の関連するキーエントリも少なくなります。 インデックスの詳細については、「 インデックス 」を参照してください。
ただし、グループ内のドキュメントのサブセットのみを取得する必要が頻繁にある場合は、ドキュメントを「ロールアップ」してもパフォーマンスが向上しない可能性があります。 さらに、小さくて個別のドキュメントがデータの自然モデルを表す場合は、そのモデルを維持する必要があります。
埋め込みデータのクエリ
埋め込みドキュメント内のデータをクエリするには、ドット表記を使用します。 配列と埋め込みドキュメント内のデータのクエリの例については、以下を参照してください。