~/VibeHandbook
$39

データベース

mongodb.com

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 } } }
]);