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

多形データの保存

項目一覧

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

同じクエリで異なるフィールドやデータ型を持つドキュメントにまとめてアクセスする必要がある場合は、多形データを保存します。

MongoDBは 柔軟なデータモデルを採用しているため、単一のコレクション内のドキュメントが同じ構造を持つ必要はありません。多形データとは、ドキュメントフィールドまたはデータ型で異なる単一のコレクション内のデータです。

この例では 、アプリケーションにはさまざまなスポーツをプレイするプロスポーツが保存されています。クエリはすべてのスポーツにアクセスしますが、各プレイヤーに保存される属性はスポーツによって異なります。

多形パターンは、同じコレクションにさまざまなドキュメントの形状を保存するため、スポーツに関係なくすべてのスポーツにアクセスする必要があるクエリのパフォーマンスを向上させます。

1
db.athletes.insertMany( [
{
sport: "bowling",
name: "Earl Anthony",
career_earnings: 1440000,
perfect_games: 25,
pba_championships: 43,
events: [
{
name: "japan_pba",
score: 300,
year: 1972
}
]
},
{
sport: "tennis",
name: "Steffi Graf",
career_earnings: 21000000,
grand_slam_wins: 22,
surfaces: [ "grass", "clay", "hard court" ]
},
{
sport: "cricket",
name: "Sachin Tendulkar",
career_earnings: 8000000,
runs: 15921,
centuries: 51,
teammates: [ "Arshad Ayub", "Kapil Dev" ]
}
] )
2

athletesコレクション内のドキュメントは異なるフィールドを持っていても、1 回のクエリですべてのドキュメントを返すことができます。

db.athletes.find()

出力:

[
{
_id: ObjectId('6706dcd66fd2c3b24f2e7e92'),
sport: 'bowling',
name: 'Earl Anthony',
career_earnings: 1440000,
perfect_games: 25,
pba_championships: 43,
events: [ { name: 'japan_pba', score: 300, year: 1972 } ]
},
{
_id: ObjectId('6706dcd66fd2c3b24f2e7e93'),
sport: 'tennis',
name: 'Steffi Graf',
career_earnings: 21000000,
grand_slam_wins: 22,
surfaces: [ 'grass', 'clay', 'hard court' ]
},
{
_id: ObjectId('6706dcd66fd2c3b24f2e7e94'),
sport: 'cricket',
name: 'Sachin Tendulkar',
career_earnings: 8000000,
runs: 15921,
centuries: 51,
teammates: [ 'Arshad Ayub', 'Kapil Dev' ]
}
]
3

多形パターンでは、特定のスポーツに固有のフィールドをクエリするために追加のロジックは必要ありません。例、次のクエリは、 20を超えるフィールド スラムの勝利 [] コンテンツを返す

db.athletes.find(
{ grand_slam_wins: { $gt: 20 } }
)

出力:

[
{
_id: ObjectId('6706cd8a6fd2c3b24f2e7e8d'),
sport: 'tennis',
name: 'Steffi Graf',
career_earnings: 21000000,
grand_slam_wins: 22,
surfaces: [ 'grass', 'clay', 'hard court' ]
}
]
  • 継承パターンの使用

  • スキーマ検証

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

戻る

多形データ