Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

JSON schema 検証のヒント

項目一覧

  • _id フィールドと additionalProperties: false
  • nullフィールド値の検証
  • 暗号化されたフィールドによる検証

このページでは、一般的な問題を回避するための JSON schema 検証のベストプラクティスについて説明します。

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 を有効な BSON 型として明示的に許可する必要があります。

たとえば次のスキーマ検証では、 storeLocationnull であるドキュメントは許可されません。

db.createCollection("sales",
{
validator:
{
"$jsonSchema": {
"properties": {
"storeLocation": { "bsonType": "string" }
}
}
}
}
)

上記の検証により、このドキュメントは拒否されます。

db.store.insertOne( { storeLocation: null } )

一方、こちらのスキーマ検証では、 storeLocationnull値が許可されます。

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 はクエリ分析エラーになります。

戻る

フィールド値を指定する