継承パターンの使用
ドキュメントがほぼ類似しており、まとめて読み取れるように同じコレクションに保持する場合は、継承パターンを使用します。継承パターンでは、共通のフィールドを持つ親エンティティを使用して、変数の形式を持つ子エンティティをグループ化します。子エンティティは一意のフィールドを持つことができますが、共通フィールドであるため、互いに密接に関連しています。
このタスクについて
この例では 、書籍店は継承パターンを使用してさまざまなタイプのメディアを保存しています。 book
親エンティティは、 title
やauthor
などの共通フィールドを保存し、複数の子エンティティがbook
エンティティから継承します。例、オーディオ、書籍、電子書籍には共通のフィールドがありますが、メディアタイプに固有の一意のフィールドもあります。
継承パターンは、これらのわずかに異なるエンティティを同じコレクションに保存するため、タイプに関係なくすべての書籍にアクセスする必要があるクエリのパフォーマンスを向上させます。
手順
サンプルデータの挿入
db.books.insertMany( [ { product_type: "ebook", title: "Practical MongoDB Aggregations", author: "Paul Done", rating: 4.8, genres: [ "programming" ], pages: 338, download_url: "<url>" }, { product_type: "audiobook", title: "Practical MongoDB Aggregations", author: "Paul Done", rating: 4.6, genres: [ "programming" ], narrators: [ "Paul Done" ], duration: { hours: 21, minutes: 8 }, time_by_chapter: [ { chapter: 1, start: "00:00:00", end: "01:00:00" }, { chapter: 2, start: "01:00:00", end: "01:55:00" } ] }, { product_type: "physical_book", title: "Practical MongoDB Aggregations", author: "Paul Done", rating: 4.9, genres: [ "programming" ], pages: 338, stock: 12, delivery_time: 2 } ] )
上記のドキュメントはいくつかの共通フィールドを共有しており、 product_type
に応じて一意のフィールドがあります。 (例: )。
ebook
ドキュメントにはdownload_url
フィールドがあります。audiobook
ドキュメントにはtime_by_chapter
フィールドがあります。physical_book
ドキュメントにはdelivery_time
フィールドがあります。
すべてのドキュメントをクエリ
books
コレクション内のドキュメントの形状は異なりますが、1 回のクエリですべてのドキュメントを返すことができます。
db.books.find()
出力:
[ { _id: ObjectId('66eb4160ef006be6eda8e2ee'), product_type: 'ebook', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.8, genres: [ 'programming' ], pages: 338, download_url: '<url>' }, { _id: ObjectId('66eb4160ef006be6eda8e2ef'), product_type: 'audiobook', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.6, genres: [ 'programming' ], narrators: [ 'Paul Done' ], duration: { hours: 21, minutes: 8 }, time_by_chapter: [ { chapter: 1, start: '00:00:00', end: '01:00:00' }, { chapter: 2, start: '01:00:00', end: '01:55:00' } ] }, { _id: ObjectId('66eb4160ef006be6eda8e2f0'), product_type: 'physical_book', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.9, genres: [ 'programming' ], pages: 338, stock: 132, delivery_time: 2 } ]
一意のフィールドのクエリ
継承パターンでは、特定のメディアタイプに固有のフィールドをクエリするために追加のロジックは必要ありません。例、次のクエリは、 20時間より長い保存期間を持つ書籍を返します。これは製品タイプaudio_book
にのみ適用されます。
db.books.find( { "duration.hours": { $gt: 20 } } )
出力:
[ { _id: ObjectId('66eb4160ef006be6eda8e2ef'), product_type: 'audiobook', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.6, genres: [ 'programming' ], narrators: [ 'Paul Done' ], duration: { hours: 21, minutes: 8 }, time_by_chapter: [ { chapter: 1, start: '00:00:00', end: '01:00:00' }, { chapter: 2, start: '01:00:00', end: '01:55:00' } ] } ]