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

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

検証を追加する前にコレクションにすでに存在するドキュメントの場合、 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 }
] )

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

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

次の挿入コマンドは、検証ルールを満たす string 値を持つ titleフィールドを含むドキュメントを追加します。

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

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

{
acknowledged: true,
insertedId: ...
}

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

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

次の挿入コマンドは、検証ルールを満たす string 値を持つ 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

を collModprepareConstraintValidationLevelに設定して を実行します。true

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

このコマンドは、bypassDocumentValidation をブロックし、バリデーターへの変更を防ぐことで、コレクションをアップグレード用に準備します。

3

を実行して、 を collModに設定します。 はvalidationLevelconstraintvalidationAction errorまたは である必要があります。errorAndLog

db.runCommand( {
collMod: "movies",
validationLevel: "constraint",
validationAction: "error"
} )

validationLevel を constraint にアップグレードする同じ collMod操作で validator を変更することはできません。このコマンドを実行する前に検証ルールを設定します。後でルールを変更するには、レベルを strict にダウングレードし、ルールを変更してから constraint にアップグレードします。

validationLevel が constraint であるため、 MongoDB は、アップグレード前に既存のドキュメントがルールを満たしているかどうかに関係なく、すべてのドキュメントの挿入とアップデートに検証ルールを適用します。

レベルを constraint に設定すると、 MongoDB はコレクション内の既存のドキュメントをすべてスキャンし、バリデーターに違反するドキュメントがある場合は collMod操作を失敗させます。このスキャンは、大規模なコレクションでは計算コストが高くなる可能性があります。操作が失敗した場合は、続行する前に、違反しているドキュメントを更新してバリデーターに合格してください。

4

次の挿入コマンドは、検証ルールを満たす string 値を持つ titleフィールドを含むドキュメントを追加します。

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

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

{
acknowledged: true,
insertedId: ...
}

重要

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