MongoDB
概要
MongoDBは、データを柔軟なJSONライクのドキュメント(BSON)として保存し、それをコレクションにまとめるドキュメントデータベースです。固定的なテーブルや行ではなく、各ドキュメントが独自の構造を持てるため、モデルを素早く進化させやすくなっています。データが入れ子のオブジェクトに自然にマッピングされるアプリケーションでよく選ばれます。
強み
- 柔軟なスキーマ:ドキュメントはマイグレーションなしで形を変え、進化できる。
- データがアプリケーションのオブジェクトに直接マッピングされ、変換コードが減る。
- 豊富なクエリ言語に加え、強力な集約パイプラインを備える。
- 組み込みのシャーディングによる水平スケーリングが可能。
- 入れ子フィールドや配列フィールドへの手厚いサポート。
トレードオフ
- 規律あるスキーマ設計をしないと、一貫性のないデータが容易に生まれる。
- 複数ドキュメントにまたがるトランザクションは存在するが、リレーショナルストアよりも重い。
- 結合(
$lookup)はSQLに比べて限定的で、データは非正規化されることが多い。 - 非正規化はデータの重複を招き、更新を複雑にする。
使いどころ
コンテンツ管理、カタログ、ユーザープロフィール、イベントログ、そして正規化されたテーブルよりもドキュメントが適している、進化する階層的なデータを扱うアプリには、MongoDBを選びましょう。
バイブコーディングとの相性
AIに指示を出す際は、「スキーマレス」を「計画なし」の意味にさせないことです。明確なドキュメント構造を定義させ、必須フィールドや型を含めてJSON SchemaバリデーションやmongooseのようなODMでそれを強制させましょう。関連データを埋め込むのか、idで参照するのかを、アクセスパターンに基づいて指示し、クエリやソートに使うフィールドにはインデックスを追加させます。良いコツとして、AIにはパラメータ化されたクエリオブジェクトを使わせ(生のユーザー文字列からクエリを組み立てさせない)、埋め込みと参照の選択理由を説明させて、読み書きや更新のコストを自分で理解できるようにしましょう。
// スキーマバリデーションがドキュメントの一貫性を保つ
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["email", "createdAt"],
properties: {
email: { bsonType: "string" },
createdAt: { bsonType: "date" },
roles: { bsonType: "array", items: { bsonType: "string" } }
}
}
}
});
db.users.createIndex({ email: 1 }, { unique: true });
// 集約:ロールごとのアクティブユーザー数をカウント
db.users.aggregate([
{ $match: { active: true } },
{ $unwind: "$roles" },
{ $group: { _id: "$roles", count: { $sum: 1 } } }
]);