スキーマ検証のバイパス
状況によっては、コレクションのスキーマ検証ルールをバイパスする必要がある場合があります。 たとえば、バックアップから検証ルールのあるコレクションに無効な可能性のあるデータを復元する場合。 このシナリオでは、古いドキュメントが新しい検証要件を満たさない可能性があります。
Context
スキーマ検証のバイパスは操作ごとに行われます。 無効なドキュメントを挿入するためにスキーマの検証をバイパスする場合、無効なドキュメントに対する将来の更新は次のいずれかになります。
スキーマ検証もバイパスします
有効なドキュメントが生成される
サポートされている操作
次のコマンドとメソッドを使用して、操作ごとに検証をバイパスできます。
applyOps
コマンドmapReduce
コマンドとdb.collection.mapReduce()
メソッドinsert
コマンドupdate
コマンド$out
{ コマンドと メソッドのaggregate
db.collection.aggregate()
$merge
} ステージと ステージ
前提条件
アクセス制御が有効になっている配置でドキュメント検証をバイパスするには、認証されたユーザーはbypassDocumentValidation
アクションを持っている必要があります。 組み込みロールdbAdmin
とrestore
はこのアクションを提供します。
手順
次の例では、スキーマ検証を含む コレクションを作成し、検証ルールをバイパスして無効なドキュメントを挿入しています。
検証ルールを使用してコレクションを作成する
students
コレクションを作成し、$jsonSchema
演算子を使用してスキーマ検証を設定します。
db.createCollection("students", { validator: { $jsonSchema: { bsonType: "object", required: [ "name", "year", "major", "address" ], properties: { name: { bsonType: "string", description: "must be a string and is required" }, year: { bsonType: "int", minimum: 2017, maximum: 3017, description: "must be an integer in [ 2017, 3017 ] and is required" } } } } } )
無効なドキュメントを挿入するには検証をバイパスします
次のドキュメントは、 year
フィールドが許可の範囲外にあるため無効です( 2017
- 3017
)。
{ name: "Alice", year: Int32( 2016 ), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } }
検証ルールをバイパスして無効なドキュメントを挿入するには、次のinsert
コマンドを実行し、 bypassDocumentValidation
オプションをtrue
に設定します。
db.runCommand( { insert: "students", documents: [ { name: "Alice", year: Int32( 2016 ), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } } ], bypassDocumentValidation: true } )
結果
ドキュメントが正常に挿入されたことを確認するには、students
コレクションをクエリします。
db.students.find()
MongoDB は挿入されたドキュメントを返します。
[ { _id: ObjectId("62bcb4db3f7991ea4fc6830e"), name: 'Alice', year: 2016, major: 'History', gpa: 3, address: { city: 'NYC', street: '33rd Street' } } ]