AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

既存のドキュメントの検証レベルを指定する

検証を追加する前にコレクションに既に存在するドキュメントについて、MongoDBがこれらのドキュメントに検証ルールをどのように適用するかを指定できます。

スキーマのvalidationLevelによって、MongoDB が検証ルールを適用するドキュメントが決まります。

検証レベル
動作

moderate

MongoDBは、検証ルールに一致する既存の有効なドキュメントの挿入とアップデートに同じ検証ルールを適用します。 検証ルールに一致しないコレクション内の既存のドキュメントの更新は、検証に合格する必要はありません。

strict

(デフォルト)MongoDB はすべてのドキュメントの挿入とアップデートに同じ検証ルールを適用します。

constraint

MongoDBは、すべてのドキュメントの挿入と更新に検証ルールを適用し、コレクション内のすべてのドキュメントがルールを満たしていることを保証します。strictとは異なり、constraint検証を持つコレクションには、レベルを設定する前に無効だったドキュメントを含めることはできません。このレベルでは、次の制限が追加されます。

  • 検証アクションは、errorまたはerrorAndLogである必要があります。

  • レベルが constraint の間は、スキーマ検証ルールを変更することはできません。検証ルールを変更するには、strict にダウングレードしてルールを変更してから、constraint にアップグレードし直してください。

  • ドキュメント検証をバイパスすることはできません。詳細については、「スキーマ検証のバイパス」を参照してください。

バージョン9.0の新機能。

このページの例では、movies コレクションを使用しています。例で使用するコレクションを作成し、ドキュメントを挿入するには、次のコマンドを実行します。

db.movies.insertMany( [ { title: "The Godfather", year: 1972 }, { title: "Casablanca", year: 1942 }] )

次の例では、moderate コレクションに movies 検証を追加し、検証ルールを満たすドキュメントを挿入します。

1

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 はすべてのドキュメント挿入および、すでにルールを満たしている既存のドキュメントの更新に検証ルールを適用します。

2

次のinsertコマンドは、文字列値を持つtitleフィールドを含むドキュメントを追加します。これは検証ルールを満たしています。

db.movies.insertOne( { title: "Wings", year: 1927 })
3

ドキュメントが検証ルールを満たしているため、挿入は成功します。MongoDBは次のような出力を返します。

{ acknowledged: true, insertedId: ...}

次の例では、strict コレクションに movies 検証を追加し、検証ルールを満たすドキュメントを挿入します。

1

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 は検証ルールをすべてのドキュメントの挿入と更新に適用します。

2

次のinsertコマンドは、文字列値を持つtitleフィールドを含むドキュメントを追加します。これは検証ルールを満たしています。

db.movies.insertOne( { title: "The Conversation", year: 1974 })
3

ドキュメントが検証ルールを満たしているため、挿入は成功します。MongoDBは次のような出力を返します。

{ acknowledged: true, insertedId: ...}

注意

strict 検証にアップグレードすると、MongoDB は、コレクション内の既存のドキュメントが検証を満たすかどうかを後から検証しません。アップグレード後、コレクションには、アップグレード前から存在していた無効なドキュメントが含まれている可能性があります。ただし、無効なドキュメントに対する更新操作は、バリデーターによって失敗します。無効なドキュメントを更新するには、まず、バリデータの検証に失敗する問題を解決します。

次の例では、movies コレクションを constraint 検証レベルにアップグレードします。constraint レベルにアップグレードすると、MongoDB はコレクション内のすべてのドキュメントがバリデーターを満たしていることを確認します。

注意

次の手順は、既存のコレクションに適用されます。コレクションの作成時に validationLevel を constraint に設定した場合、最初にレベルを strict に設定したり、コレクションを準備したりする必要はありません。

1

コレクションの validationLevel がすでに strict でない場合は、手順に従って 厳密な検証を指定します。

2

prepareConstraintValidationLevel を true に設定して collMod を実行する:

db.runCommand( { collMod: "movies", prepareConstraintValidationLevel: true} )

このコマンドは、bypassDocumentValidationをブロックし、バリデーターへの変更を防止することで、アップグレードに向けてコレクションを準備します。MongoDBがバイパスを制限することを学ぶには、「スキーマ検証のバイパス」を参照してください。

3

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 操作は失敗します。このスキャンは、大規模なコレクションでは計算コストが高くなる可能性があります。操作が失敗した場合は、続行する前に、違反しているドキュメントを更新してバリデーターに合格するようにしてください。

4

次のinsertコマンドは、文字列値を持つtitleフィールドを含むドキュメントを追加します。これは検証ルールを満たしています。

db.movies.insertOne( { title: "Sunrise", year: 1927 })
5

ドキュメントが検証ルールを満たしているため、挿入は成功します。MongoDBは次のような出力を返します。

{ acknowledged: true, insertedId: ...}

重要

エラー出力は人間が消費するためのものです。 将来変更される可能性があるため、スクリプトでは依存しないでください。