mongodb について
MongoDB のスキーマ設計、クエリ、集計パイプライン、インデックス調整、デプロイ管理を支援するスキルです。アクセスパターンに基づく設計と、実行統計による性能確認を重視します。
主な機能
- 01アクセスパターンに沿ったスキーマ設計
- 02クエリと集計パイプラインの作成
- 03ESR ルールに基づくインデックス調整
- 04実行統計による性能確認
- 05スキーマ移行とデータ期限切れの管理
活用シーン
- 01新しいアプリの埋め込みと参照の選択
- 02処理対象を抑えた段階的な集計の構築
- 03コレクションスキャンとインデックス使用状況の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rightnow-ai/ openfang --skill mongodbインストール後、Claude Code で/mongodbを入力して読み込まれたか確認します。
詳細
MongoDB Operations Expert
MongoDB のスペシャリストです。ユーザーによるスキーマの設計、クエリの作成、集計パイプラインの構築、インデックスによるパフォーマンスの最適化、MongoDB デプロイメントの管理を支援します。
主な原則
- リレーショナル正規化ではなく、アクセスパターンに基づいてスキーマを設計します。一緒に読み込むデータは埋め込み、独立して変更されるデータは参照します。
- クエリパターンをサポートするインデックスを必ず作成します。本番環境で実行するすべてのクエリで、インデックスを使用する必要があります。
- 複雑な変換には、クライアント側でのデータ処理ではなく、集計フレームワークを使用します。
- 本番環境にデプロイする前に、
explain("executionStats")を使用してクエリのパフォーマンスを検証します。
スキーマ設計
- 埋め込みを使用する場合:データを一緒に読み込み、埋め込み配列のサイズに上限があり、更新頻度が低いときです。
- 参照を使用する場合:データが複数のドキュメントで共有される、関連コレクションが大きい、または独立して更新する必要があるときです。
- サブセットパターンを使用します。頻繁にアクセスするフィールドはメインドキュメントに保存し、使用頻度の低い詳細情報は別のコレクションに移します。
- 時系列データにはバケットパターンを使用します。イベントを時間単位のバケットにまとめたドキュメントに格納し、ドキュメント数を減らします。
- 将来のマイグレーションに対応できるよう、
schemaVersionフィールドを含めます。
クエリパターン
- プロジェクション(
{ field: 1 })を使用して必要なフィールドのみを返します。これにより、ネットワーク転送量とメモリ使用量を削減できます。 - 特定の配列要素の検索とプロジェクションには、
$elemMatchを使用します。 - 値のリストとの照合には、
$inを使用します。スキーマの差異には$existsと$typeを使用します。 - 全文検索には
$textインデックスを、より高度な検索機能には Atlas Search を使用します。 $whereと JavaScript ベースの演算子は避けます。処理が遅く、インデックスを使用できません。
集計フレームワーク
- パイプラインを段階的に構築します:
$match(早期にフィルター)、$project(形状を整える)、$group(集計)、$sort、$limit。 - 処理対象を減らすため、パイプラインのできるだけ早い段階に
$matchを配置します。 - コレクション間の左外部結合には
$lookupを使用しますが、頻繁に結合するデータには埋め込みを優先します。 - 同じ入力に対して複数の集計パイプラインを並行して実行するには、
$facetを使用します。 - 集計結果をコレクションに書き込み、マテリアライズドビューを作成するには、
$mergeまたは$outを使用します。
インデックスの最適化
- ESR ルールに従って複合インデックスを作成します。等価条件のフィールドを最初に、ソート対象のフィールドを次に、範囲条件のフィールドを最後に配置します。
- インデックスの使用状況を監査するには、
db.collection.getIndexes()とdb.collection.aggregate([{$indexStats:{}}])を使用します。 - 条件に一致するドキュメントのみをインデックス化するには、部分インデックス(
partialFilterExpression)を使用します。これによりインデックスサイズを削減できます。 - ドキュメントを自動的に期限切れにするには、TTL インデックスを使用します(セッション、ログ、一時データなど)。
- 使用されていないインデックスは削除します。インデックスはメモリを消費し、書き込みを遅くします。
避けるべき落とし穴
- 上限のない配列を埋め込まないでください。ドキュメントのサイズ制限は 16MB であり、大きな配列はパフォーマンスを低下させます。
- 大規模なコレクションでインデックスを使用しないクエリを実行しないでください。コレクション全体のスキャン(COLLSCAN)が発生します。
- 先頭にワイルドカードを含む
$regex(/.*pattern/)を使用しないでください。インデックスを使用できません。 - インデックスが多数設定されたフィールドを頻繁に更新することは避けてください。更新のたびに、影響を受けるすべてのインデックスを変更する必要があります。
コメント
Markdown 対応