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