JSON schema 検証のヒント
このページでは、一般的な問題を回避するための JSON schema 検証のベストプラクティスについて説明します。
_id
フィールドと additionalProperties: false
JSON schema でadditionalProperties: false
を指定すると、MongoDB は schema のproperties
オブジェクトに含まれていないフィールドを含むドキュメントを拒否します。
すべてのオブジェクトには自動生成された_id
フィールドが含まれているため、additionalProperties: false
を設定するときは、properties
オブジェクトに _id
フィールドを含める必要があります。含めない場合、すべてのドキュメントが拒否されます。
たとえば以下の検証では、有効なドキュメントはありません。
{ "$jsonSchema": { "required": [ "_id", "storeLocation" ], "properties": { "storeLocation": { "bsonType": "string" } }, "additionalProperties": false } }
この検証により、 storeLocation
は文字列であることが保証されます。ただし、 properties
オブジェクトには_id
フィールドが含まれていません。
コレクション内のドキュメントを許可するには、 properties
オブジェクトをアップデートして_id
フィールドを含める必要があります。
{ "$jsonSchema": { "required": [ "_id", "storeLocation" ], "properties": { "_id": { "bsonType": "objectId" }, "storeLocation": { "bsonType": "string" } }, "additionalProperties": false } }
フィールド値の検証null
コレクションに送信されるオブジェクトに欠落しているフィールド値を含めない代わりに、欠落しているフィールド値を null
に設定するようにアプリケーションが設定されている場合があります。
スキーマがフィールドのデータ型を検証する場合、そのフィールドに null
値を持つドキュメントを挿入するには、null
を有効な BSON 型として明示的に許可する必要があります。
たとえば次のスキーマ検証では、 storeLocation
がnull
であるドキュメントは許可されません。
db.createCollection("sales", { validator: { "$jsonSchema": { "properties": { "storeLocation": { "bsonType": "string" } } } } } )
上記の検証により、このドキュメントは拒否されます。
db.store.insertOne( { storeLocation: null } )
一方、こちらのスキーマ検証では、 storeLocation
のnull
値が許可されます。
db.createCollection("store", { validator: { "$jsonSchema": { "properties": { "storeLocation": { "bsonType": [ "null", "string" ] } } } } } )
上記の検証により、このドキュメントは許可されます。
db.store.insertOne( { storeLocation: null } )
注意
null フィールドと欠落フィールドの比較
null
フィールド値は、フィールドの欠落とは異なります。ドキュメントにフィールドがない場合、MongoDB はそのフィールドを検証しません。
暗号化されたフィールドによる検証
コレクションでのクライアント側フィールドレベル暗号化またはQueryable Encryptionが有効になっている場合、検証は次の制限に従います。
collMod
の実行時に、libmongocrypt ライブラリは CSFLE に対して、このコマンドで指定される JSON 暗号化スキーマを優先します。これにより、まだスキーマがないコレクションにスキーマを設定できます。Queryable Encryption の場合、暗号化されたフィールドを含む JSON schema はクエリ分析エラーになります。