検証を追加する前にコレクションにすでに存在するドキュメントの場合、 MongoDB がこれらのドキュメントに検証ルールを適用する方法を指定できます。
Context
スキーマのvalidationLevelによって、MongoDB が検証ルールを適用するドキュメントが決まります。
検証レベル | 動作 |
|---|---|
| MongoDBは、検証ルールに一致する既存の有効なドキュメントの挿入とアップデートに同じ検証ルールを適用します。 検証ルールに一致しないコレクション内の既存のドキュメントの更新は、検証に合格する必要はありません。 |
| (デフォルト)MongoDB はすべてのドキュメントの挿入とアップデートに同じ検証ルールを適用します。 |
| MongoDB は、すべてのドキュメント挿入とアップデートに検証ルールを適用し、コレクション内のすべてのドキュメントがルールを満たすことを保証します。
バージョン9.0の新機能。 |
前提条件
このページの例では、 moviesコレクションを使用しています。コレクションを作成し、例で使用されるドキュメントを挿入するには、次のコマンドを実行します。
db.movies.insertMany( [ { title: "The Godfather", year: 1972 }, { title: "Casablanca", year: 1942 } ] )
中程度の検証を指定する
次の例では、moviesコレクションに moderate バリデーターを追加し、検証ルールを満たすドキュメントを挿入します。
検証レベルが 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 はすべてのドキュメント挿入と、すでにルールを満たしている既存のドキュメントのアップデートに検証ルールを適用します。
厳密な検証を指定する
次の例では、moviesコレクションに strict バリデーターを追加し、検証ルールを満たすドキュメントを挿入します。
検証レベルが 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
を collModprepareConstraintValidationLevelに設定して を実行します。true
db.runCommand( { collMod: "movies", prepareConstraintValidationLevel: true } )
このコマンドは、bypassDocumentValidation をブロックし、バリデーターへの変更を防ぐことで、コレクションをアップグレード用に準備します。
検証レベルをconstraint に設定します。
を実行して、 を collModに設定します。 はvalidationLevelconstraintvalidationAction errorまたは である必要があります。errorAndLog
db.runCommand( { collMod: "movies", validationLevel: "constraint", validationAction: "error" } )
validationLevel を constraint にアップグレードする同じ collMod操作で validator を変更することはできません。このコマンドを実行する前に検証ルールを設定します。後でルールを変更するには、レベルを strict にダウングレードし、ルールを変更してから constraint にアップグレードします。
validationLevel が constraint であるため、 MongoDB は、アップグレード前に既存のドキュメントがルールを満たしているかどうかに関係なく、すべてのドキュメントの挿入とアップデートに検証ルールを適用します。
レベルを constraint に設定すると、 MongoDB はコレクション内の既存のドキュメントをすべてスキャンし、バリデーターに違反するドキュメントがある場合は collMod操作を失敗させます。このスキャンは、大規模なコレクションでは計算コストが高くなる可能性があります。操作が失敗した場合は、続行する前に、違反しているドキュメントを更新してバリデーターに合格してください。
重要
エラー出力は人間が消費するためのものです。 将来変更される可能性があるため、スクリプトでは依存しないでください。