検証を追加する前にコレクションに既に存在するドキュメントについて、MongoDBがこれらのドキュメントに検証ルールをどのように適用するかを指定できます。
Context
スキーマのvalidationLevelによって、MongoDB が検証ルールを適用するドキュメントが決まります。
検証レベル | 動作 |
|---|---|
| MongoDBは、検証ルールに一致する既存の有効なドキュメントの挿入とアップデートに同じ検証ルールを適用します。 検証ルールに一致しないコレクション内の既存のドキュメントの更新は、検証に合格する必要はありません。 |
| (デフォルト)MongoDB はすべてのドキュメントの挿入とアップデートに同じ検証ルールを適用します。 |
| MongoDBは、すべてのドキュメントの挿入と更新に検証ルールを適用し、コレクション内のすべてのドキュメントがルールを満たしていることを保証します。
バージョン9.0の新機能。 |
前提条件
このページの例では、movies コレクションを使用しています。例で使用するコレクションを作成し、ドキュメントを挿入するには、次のコマンドを実行します。
db.movies.insertMany( [ { title: "The Godfather", year: 1972 }, { title: "Casablanca", year: 1942 }] )中程度の検証を指定する
次の例では、moderate コレクションに movies 検証を追加し、検証ルールを満たすドキュメントを挿入します。
検証レベルが moderate の検証ルールを指定します。
moderate validationLevelを使用してmoviesコレクションにバリデーターを追加する:
db.runCommand( { collMod: "movies", validator: { $jsonSchema: { bsonType: "object", required: [ "title" ], properties: { title: { bsonType: "string", description: "title must be a string and is required" } } } }, validationLevel: "moderate"} )validationLevelがmoderateであるため、MongoDB はすべてのドキュメント挿入および、すでにルールを満たしている既存のドキュメントの更新に検証ルールを適用します。
厳密な検証を指定する
次の例では、strict コレクションに movies 検証を追加し、検証ルールを満たすドキュメントを挿入します。
検証レベルが strict の検証ルールを指定します。
strict validationLevelを使用してmoviesコレクションにバリデーターを追加する:
db.runCommand( { collMod: "movies", validator: { $jsonSchema: { bsonType: "object", required: [ "title" ], properties: { title: { bsonType: "string", description: "title must be a string and is required" } } } }, validationLevel: "strict"} )validationLevel が strict であるため、MongoDB は検証ルールをすべてのドキュメントの挿入と更新に適用します。
注意
strict 検証にアップグレードすると、MongoDB は、コレクション内の既存のドキュメントが検証を満たすかどうかを後から検証しません。アップグレード後、コレクションには、アップグレード前から存在していた無効なドキュメントが含まれている可能性があります。ただし、無効なドキュメントに対する更新操作は、バリデーターによって失敗します。無効なドキュメントを更新するには、まず、バリデータの検証に失敗する問題を解決します。
制約の検証を指定する
次の例では、movies コレクションを constraint 検証レベルにアップグレードします。constraint レベルにアップグレードすると、MongoDB はコレクション内のすべてのドキュメントがバリデーターを満たしていることを確認します。
注意
次の手順は、既存のコレクションに適用されます。コレクションの作成時に validationLevel を constraint に設定した場合、最初にレベルを strict に設定したり、コレクションを準備したりする必要はありません。
(条件付き)validationLevel を strict に設定します。
コレクションの validationLevel がすでに strict でない場合は、手順に従って 厳密な検証を指定します。
constraint レベルに向けてコレクションを準備します。
prepareConstraintValidationLevel を true に設定して collMod を実行する:
db.runCommand( { collMod: "movies", prepareConstraintValidationLevel: true} )このコマンドは、bypassDocumentValidationをブロックし、バリデーターへの変更を防止することで、アップグレードに向けてコレクションを準備します。MongoDBがバイパスを制限することを学ぶには、「スキーマ検証のバイパス」を参照してください。
検証レベルを constraint に設定します。
collMod を実行して、validationLevel を constraint に設定します。validationAction は error または errorAndLog である必要があります。
db.runCommand( { collMod: "movies", validationLevel: "constraint", validationAction: "error"} )validationLevel を constraint にアップグレードする同じ collMod 操作で、validator を変更することはできません。このコマンドを実行する前に、検証ルールを設定してください。後でルールを変更するには、レベルをstrictにダウングレードし、ルールを修正し、その後レベルをconstraintにアップグレードします。
validationLevel が constraint であるため、MongoDB は、アップグレード前に既存のドキュメントがルールを満たしていたかどうかにかかわらず、すべてのドキュメントの挿入と更新に検証ルールを適用します。
レベルを constraint に設定すると、MongoDB はコレクション内の既存のすべてのドキュメントをスキャンし、いずれかのドキュメントがバリデーターに違反している場合、collMod 操作は失敗します。このスキャンは、大規模なコレクションでは計算コストが高くなる可能性があります。操作が失敗した場合は、続行する前に、違反しているドキュメントを更新してバリデーターに合格するようにしてください。
重要
エラー出力は人間が消費するためのものです。 将来変更される可能性があるため、スクリプトでは依存しないでください。