Docs Menu
Docs Home
/
MongoDB Atlas
/ /

無制限の配列を避ける

項目一覧

  • Overview
  • 詳細

MongoDB の豊富なスキーマモデルの利点の 1 つは、配列をドキュメントフィールド値として保存できることです。配列をフィールド値として保存すると、リレーショナルデータベースのように別々のコレクションをまたがるのではなく、1 つのドキュメントで 1 対多または多対多の関係データベースをモデル化できます。

ただし、ドキュメント内の配列に要素を継続的に追加する場合は注意が必要です。 配列の要素数を制限しないと、ドキュメントが予想外の大きさになる可能性があります。 配列が大きくなるにつれて、その配列のインデックスの読み取りと構築のパフォーマンスは徐々に低下します。 配列が大きくなると、アプリケーションのリソースに負担がかかり、ドキュメントが BSON ドキュメント サイズの制限を超えるリスクがあります。

あるいは、パフォーマンスを向上させ、ドキュメントを管理しやすいサイズに保つために、配列に境界を設定することも検討できます。

次の publishers コレクションのスキーマを考えてみましょう。

// publishers collection
{
"_id": "orielly",
"name": "O'Reilly Media",
"founded": 1980,
"location": "CA",
"books": [
{
"_id": 123456789,
"title": "MongoDB: The Definitive Guide",
"author": [ "Kristina Chodorow", "Mike Dirolf" ],
"published_date": ISODate("2010-09-24"),
"pages": 216,
"language": "English"
},
{
"_id": 234567890,
"title": "50 Tips and Tricks for MongoDB Developer",
"author": "Kristina Chodorow",
"published_date": ISODate("2011-05-06"),
"pages": 68,
"language": "English"
}
]
}

このシナリオでは、 books 配列は無制限です。この出版会社から新しい書籍がリリースされるたびに、 books 配列に新しいサブドキュメントが追加されます。出版会社が書籍をリリースし続ければ、ドキュメントはやがて非常に大きくなり、アプリケーションに不釣り合いな量のメモリ負荷をかけることになります。

可変で境界のない配列を避けるためには、 publishersコレクションを 2 つのコレクションに分割します。1 つはpublishersで、もう 1 つはbooks用です。 bookドキュメント全体をpublishers ドキュメントに埋め込む代わりに、書籍ドキュメントの中に出版社への 参照 を含めます。

// publishers collection
{
"_id": "oreilly",
"name": "O'Reilly Media",
"founded": 1980,
"location": "CA"
}
// books collection
{
"_id": 123456789,
"title": "MongoDB: The Definitive Guide",
"author": [ "Kristina Chodorow", "Mike Dirolf" ],
"published_date": ISODate("2010-09-24"),
"pages": 216,
"language": "English",
"publisher_id": "oreilly"
}
{
"_id": 234567890,
"title": "50 Tips and Tricks for MongoDB Developer",
"author": "Kristina Chodorow",
"published_date": ISODate("2011-05-06"),
"pages": 68,
"language": "English",
"publisher_id": "oreilly"
}

この更新されたスキーマでは、publishers コレクション内の境界のない配列が削除され、publisher_id フィールドを使用して各書籍ドキュメントに出版者への参照が配置されます。これにより、各ドキュメントのサイズが管理可能になり、ドキュメントフィールドが異常に大きくなるリスクがなくなります。

この方法は、アプリケーションが書籍と出版会社の情報を個別に読み込む場合に特に適しています。アプリケーションで書籍と情報を一緒に必要とする場合は、 $lookup 操作を実行して、 publishersbooks のコレクションのデータを結合する必要があります。$lookup 操作はあまりパフォーマンスが良くありませんが、このシナリオでは無制限の配列を回避するためにトレードオフの価値があるかもしれません。

柔軟なデータモデルをスキーマに組み込む方法については、MongoDB.live 2020 の以下のプレゼンテーションを参照してください。

戻る

$lookup を削減

項目一覧