無効なドキュメントの処理方法を選択する
MongoDB が検証ルールに違反するドキュメントをどのように処理するかは指定できます。 操作によって無効なドキュメントが作成される場合、MongoDB は次のいずれかを実行できます。
検証条件に違反する挿入または更新を拒否します。 これはデフォルトの動作です。
操作の続行を許可しますが、違反を MongoDB ログに記録します。
無効なドキュメントを拒否することで、スキーマの一貫性が保たれます。 ただし、スキーマが確立される前のドキュメントを含むデータ移行など、特定のシナリオでは無効なドキュメントを許可する必要がある場合があります。
Context
スキーマの validationAction
オプションによって、MongoDB が無効なドキュメントを処理する方法が決まります。
検証アクション | 動作 |
---|---|
| (デフォルト)MongoDB は、検証条件に違反する挿入または更新を拒否します。 |
| MongoDB は操作の続行を許可しますが、違反を MongoDB ログに記録します。 |
オプション1: 無効なドキュメントを排除する
次の手順は、無効なドキュメントを拒否するスキーマ検証を作成する方法を示しています。
validationAction: "error"
を使用してコレクションを作成します。
validationAction: "error"
を持つ JSON schema バリデーターを使用してcontacts
コレクションを作成します。
db.createCollection( "contacts", { validator: { $jsonSchema: { bsonType: "object", required: [ "phone" ], properties: { phone: { bsonType: "string", description: "must be a string and is required" }, email: { bsonType : "string", pattern : "@mongodb\\.com$", description: "must be a string and end with '@mongodb.com'" } } } }, validationAction: "error" } )
error
validationAction
を使用すると、MongoDB は無効なドキュメントを拒否し、コレクションに挿入されなくなります。
無効なドキュメントを挿入しようとします。
次のドキュメントを挿入してみてください。
db.contacts.insertOne( { name: "Amanda", email: "amanda@xyz.com" } )
このドキュメントが検証ルールに違反する理由は以下のとおりです。
email
フィールドは正規表現パターンに一致しません。email
フィールドは@mongodb.com
で終わる必要があります。必須の
phone
フィールドがありません。
操作は、次のエラーで失敗します。
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("6377cca4aac957f2b77ea955"), details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'email', description: "must be a string and end with '@mongodb.com'", details: [ { operatorName: 'pattern', specifiedAs: { pattern: '@mongodb\\.com$' }, reason: 'regular expression did not match', consideredValue: 'amanda@xyz.com' } ] } ] }, { operatorName: 'required', specifiedAs: { required: [ 'phone' ] }, missingProperties: [ 'phone' ] } ] } }
オプション 2: 無効なドキュメントを許可するが、ログに記録する
次の手順は、無効なドキュメントを許可し、無効なドキュメントを MongoDB ログに記録するスキーマ検証を作成する方法を示しています。
validationAction: "warn"
を使用してコレクションを作成します。
validationAction: "warn"
を持つ JSON schema バリデーターを使用してcontacts2
コレクションを作成します。
db.createCollection( "contacts2", { validator: { $jsonSchema: { bsonType: "object", required: [ "phone" ], properties: { phone: { bsonType: "string", description: "must be a string and is required" }, email: { bsonType : "string", pattern : "@mongodb\\.com$", description: "must be a string and end with '@mongodb.com'" } } } }, validationAction: "warn" } )
warn
validationAction
を使用すると、無効なドキュメントをコレクションに挿入できます。 無効なドキュメントは MongoDB ログに記録されます
無効なドキュメントのログを確認します。
MongoDB ログを読み取り可能な形式で表示するには、次のコマンドを実行します。
db.adminCommand( { getLog:'global'} ).log.forEach(x => { print(x) } )
MongoDB ログには、次のオブジェクトのようなエントリが含まれています。
{ "t": { "$date": "2022-11-18T13:30:43.607-05:00" }, "s": "W", "c": "STORAGE", "id": 20294, "ctx": "conn2", "msg": "Document would fail validation", "attr": { "namespace": "test.contacts2", "document": { "_id": { "$oid": "6377cf53d59841355cac1cd0" }, "name": "Amanda", "email": "amanda@xyz.com" }, "errInfo": { "failingDocumentId": { "$oid": "6377cf53d59841355cac1cd0" }, "details": { "operatorName": "$jsonSchema", "schemaRulesNotSatisfied": [{ "operatorName": "properties", "propertiesNotSatisfied": [{ "propertyName": "email", "description": "must be a string and end with '@mongodb.com'", "details": [{ "operatorName": "pattern", "specifiedAs": { "pattern": "@mongodb\\.com$" }, "reason": "regular expression did not match", "consideredValue": "amanda@xyz.com" }] }] }, { "operatorName": "required", "specifiedAs": { "required": ["phone"] }, "missingProperties": ["phone"] }] } } } }