Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

継承パターンの使用

項目一覧

  • このタスクについて
  • 手順
  • 詳細

ドキュメントがほぼ類似しており、まとめて読み取れるように同じコレクションに保持する場合は、継承パターンを使用します。継承パターンでは、共通のフィールドを持つ親エンティティを使用して、変数の形式を持つ子エンティティをグループ化します。子エンティティは一意のフィールドを持つことができますが、共通フィールドであるため、互いに密接に関連しています。

この例では 、書籍店は継承パターンを使用してさまざまなタイプのメディアを保存しています。 book親エンティティは、 titleauthorなどの共通フィールドを保存し、複数の子エンティティがbookエンティティから継承します。例、オーディオ、書籍、電子書籍には共通のフィールドがありますが、メディアタイプに固有の一意のフィールドもあります。

継承パターンは、これらのわずかに異なるエンティティを同じコレクションに保存するため、タイプに関係なくすべての書籍にアクセスする必要があるクエリのパフォーマンスを向上させます。

1
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フィールドがあります。

2

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
}
]
3

継承パターンでは、特定のメディアタイプに固有のフィールドをクエリするために追加のロジックは必要ありません。例、次のクエリは、 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' }
]
}
]
  • 多形データの保存

  • スキーマ検証

  • クエリをサポートするインデックスの作成

戻る

多形パターン