MongoDB データの検証

MongoDBBeginner
オンラインで実践に進む

はじめに

このラボでは、MongoDB におけるデータ検証の基本を学びます。データ検証は、コレクション内のすべてのドキュメントが特定の構造とルールに従うことを保証することで、データの整合性と一貫性を維持する上で重要な機能です。検証ルールを持つコレクションの作成方法、有効なデータと無効なデータの挿入を試みることでこれらのルールをテストする方法、既存のコレクションの検証ルールを変更する方法を学びます。このラボの終わりには、MongoDB データベース内で直接データ品質を強制できるようになります。

スキーマ検証付きコレクションの作成

最初のステップでは、MongoDB サーバーに接続し、特定の検証ルールを持つ新しいコレクションを作成します。これらのルールは、ドキュメント内のフィールドに期待されるデータ型と制約を定義します。

まず、MongoDB Shell (mongosh) を開いてデータベースと対話します。このインタラクティブシェルは、MongoDB を管理するための主要なツールです。

mongosh

シェルに入ると、test> のようなプロンプトが表示されます。これは、デフォルトの test データベースに接続されていることを示しています。dataValidationLab という名前の新しいデータベースを作成して切り替えましょう。

use dataValidationLab

次に、users コレクションを作成します。コレクションを作成する際に、validator ドキュメントを含め、$jsonSchema を使用してルールを定義します。

db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "age", "email"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        age: {
          bsonType: "int",
          minimum: 18,
          description: "must be an integer >= 18 and is required"
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "must be a valid email address and is required"
        }
      }
    }
  }
});

コマンドを実行すると、成功を示す出力が表示されるはずです。

{ "ok": 1 }

バリデーターの内訳を見てみましょう。

  • bsonType: "object": ドキュメントのルートはオブジェクトである必要があります。
  • required: ["name", "age", "email"]: nameageemail フィールドは、すべてのドキュメントに存在する必要があります。
  • properties: このオブジェクトは、個々のフィールドのルールを定義します。
    • name: string である必要があります。
    • age: int (整数) であり、minimum 値は 18 である必要があります。
    • email: 正規表現 pattern に一致する string である必要があり、これは基本的なメール形式をチェックします。

これで、データ検証ルールを持つコレクションを正常に作成しました。次のステップでは、これらのルールをテストします。

ドキュメント挿入による検証テスト

users コレクションに検証ルールが設定されたので、それらをテストしてみましょう。ここでは、ルールに違反するドキュメントをいくつか、そしてそれに準拠するドキュメントを 1 つ挿入しようと試みます。これにより、MongoDB がスキーマをどのように強制するかを理解するのに役立ちます。

まず、age フィールドのデータ型が間違っているドキュメントを挿入してみましょう。整数ではなく文字列 "25" を指定します。

db.users.insertOne({
  name: "John Doe",
  age: "25",
  email: "john.doe@example.com"
});

この操作は失敗します。age フィールドが bsonType: "int" の要件を満たしていないため、MongoDB はドキュメントを拒否し、WriteError を返します。エラーメッセージには、検証の失敗に関する詳細が含まれます。

MongoServerError: Document failed validation

次に、必須フィールドである email が欠落しているドキュメントを挿入してみましょう。

db.users.insertOne({
  name: "Jane Doe",
  age: 30
});

これも失敗します。なぜなら、email フィールドはバリデーターの required 配列に含まれているからです。同様の WriteCommandError が表示されます。

最後に、すべてのルールに従ったドキュメントを挿入してみましょう。nameemail は文字列であり、age は 18 以上の整数です。

db.users.insertOne({
  name: "Alice",
  age: 28,
  email: "alice@example.com"
});

今回はコマンドが成功し、新しく挿入されたドキュメントの _id を含む確認メッセージが表示されます。

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

有効なドキュメントが追加されたことを確認するために、コレクションをクエリできます。

db.users.find();

出力には、検証に成功した 1 つのドキュメントが表示されます。

[
  {
    "_id": ObjectId("..."),
    "name": "Alice",
    "age": 28,
    "email": "alice@example.com"
  }
]

既存のバリデーターを変更する

アプリケーションの要件は時間とともに変化する可能性があり、検証ルールを更新する必要が生じる場合があります。このステップでは、collMod コマンドを使用して既存のコレクションのバリデーターを変更し、新しいルールをテストする方法を学びます。

ここでは、users コレクションに新しい status フィールドを追加すると仮定します。このフィールドは文字列であり、"active" または "inactive" のいずれかの値のみを持つ必要があります。

新しいバリデーターを適用するために collMod (collection modify) コマンドを使用します。

db.runCommand({
  collMod: "users",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "age", "email", "status"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        age: {
          bsonType: "int",
          minimum: 18,
          description: "must be an integer >= 18 and is required"
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "must be a valid email address and is required"
        },
        status: {
          enum: ["active", "inactive"],
          description: "can only be one of the enum values and is required"
        }
      }
    }
  }
});

コマンドは成功すると { "ok": 1 } を返します。これで、status フィールドを必須とし、enum キーワードを使用してその値を制限するようにバリデーターが更新されました。

次に、新しいルールをテストしてみましょう。無効なステータスを持つドキュメントを挿入してみてください。

db.users.insertOne({
  name: "Bob",
  age: 45,
  email: "bob@example.com",
  status: "pending"
});

これは失敗します。なぜなら、"pending"status フィールドの enum リストに含まれていないからです。次に、更新されたルールに準拠するドキュメントを挿入します。

db.users.insertOne({
  name: "Bob",
  age: 45,
  email: "bob@example.com",
  status: "active"
});

この挿入は成功します。コレクション内のすべてのドキュメントを表示するには、再度 find() を実行します。

db.users.find();

これで、Alice と Bob の両方のドキュメントが表示されます。ルール変更前に挿入された Alice のドキュメントには status フィールドがないことに注意してください。デフォルトでは、検証は既存のドキュメントが変更されるまで適用されません。

まとめ

この実験では、MongoDB でデータ検証を実装するための基本的なテクニックを学びました。まず、データ型、必須フィールド、値の制約を強制するために $jsonSchema バリデーターを持つコレクションを作成しました。次に、無効なドキュメントと有効なドキュメントの両方を挿入しようと試みることでこれらのルールをテストし、MongoDB がスキーマに準拠しないデータをどのように拒否するかを観察しました。最後に、新しい要件に適応するために collMod コマンドを使用して既存のコレクションの検証ルールを変更する方法を学びました。これらのスキルは、堅牢なアプリケーションを構築し、MongoDB データベースで高いデータ品質を維持するために不可欠です。