$jsonSchema
項目一覧
定義
$jsonSchema
$jsonSchema
演算子は、指定された JSON schema を満たすドキュメントと一致します。$jsonSchema
演算子式の構文は次のとおりです。{ $jsonSchema: <JSON Schema object> } JSON schema オブジェクトは 4JSON schema の標準 のドラフト に従ってフォーマットされます。 。
{ <keyword1>: <value1>, ... } 以下に例を挙げます。
{ $jsonSchema: { required: [ "name", "major", "gpa", "address" ], properties: { name: { bsonType: "string", description: "must be a string and is required" }, address: { bsonType: "object", required: [ "zipcode" ], properties: { "street": { bsonType: "string" }, "zipcode": { bsonType: "string" } } } } } } MongoDB でサポートされているキーワードのリストについては、「使用可能なキーワード 」を参照してください。
動作
機能の互換性
を使用するには、 featureCompatibilityVersion を "3.6"
$jsonSchema
以上に設定する必要があります。
ドキュメントバリデーター
ドキュメント バリデーターで$jsonSchema
を使用すると、挿入操作とアップデート操作で指定されたスキーマを強制できます。
db.createCollection( <collection>, { validator: { $jsonSchema: <schema> } } ) db.runCommand( { collMod: <collection>, validator:{ $jsonSchema: <schema> } } )
クエリ条件
読み取りおよび書込み操作のクエリ条件で$jsonSchema
を使用すると、指定されたスキーマを満たすドキュメントをコレクション内の検索できます。
db.collection.find( { $jsonSchema: <schema> } ) db.collection.aggregate( [ { $match: { $jsonSchema: <schema> } } ] ) db.collection.updateMany( { $jsonSchema: <schema> }, <update> ) db.collection.deleteOne( { $jsonSchema: <schema> } )
指定されたスキーマを満たさ ない $jsonSchema
コレクション内のドキュメントを検索するには、 式で$nor
式を使用します。例:
db.collection.find( { $nor: [ { $jsonSchema: <schema> } ] } ) db.collection.aggregate( [ { $match: { $nor: [ { $jsonSchema: <schema> } ] } }, ... ] ) db.collection.updateMany( { $nor: [ { $jsonSchema: <schema> } ] }, <update> ) db.collection.deleteOne( { $nor: [ { $jsonSchema: <schema> } ] } )
例
スキーマ検証
次のdb.createCollection()
メソッドは、 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" }, major: { enum: [ "Math", "English", "Computer Science", "History", null ], description: "can only be one of the enum values and is required" }, gpa: { bsonType: [ "double" ], description: "must be a double if the field exists" }, address: { bsonType: "object", required: [ "city" ], properties: { street: { bsonType: "string", description: "must be a string if the field exists" }, city: { bsonType: "string", "description": "must be a string and is required" } } } } } } } )
コレクション用に作成されたvalidator
の場合、 validator
にdouble
が必要な場合、 gpa
は整数であるため、次の挿入操作は失敗します。
db.students.insertOne( { name: "Alice", year: Int32( 2019 ), major: "History", gpa: Int32( 3 ), address: { city: "NYC", street: "33rd Street" } } )
この操作では、次のエラーが返されます。
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("61aa577f666a50a8fccd7ec2"), details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'gpa', description: 'must be a double if the field exists', details: [ [Object] ] } ] } ] } }
gpa
を double に変更すると、挿入は成功します。
db.students.insertOne( { name: "Alice", year: NumberInt(2019), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } } )
クエリ条件
読み取り操作と書込み操作のクエリ条件で$jsonSchema
を使用すると、指定されたスキーマを満たすドキュメントをコレクション内の検索できます。
たとえば、次のドキュメントを含むサンプル コレクションinventory
を作成します。
db.inventory.insertMany( [ { item: "journal", qty: NumberInt(25), size: { h: 14, w: 21, uom: "cm" }, instock: true }, { item: "notebook", qty: NumberInt(50), size: { h: 8.5, w: 11, uom: "in" }, instock: true }, { item: "paper", qty: NumberInt(100), size: { h: 8.5, w: 11, uom: "in" }, instock: 1 }, { item: "planner", qty: NumberInt(75), size: { h: 22.85, w: 30, uom: "cm" }, instock: 1 }, { item: "postcard", qty: NumberInt(45), size: { h: 10, w: 15.25, uom: "cm" }, instock: true }, { item: "apple", qty: NumberInt(45), status: "A", instock: true }, { item: "pears", qty: NumberInt(50), status: "A", instock: true } ] )
次に、次のサンプル スキーマ オブジェクトを定義します。
let myschema = { required: [ "item", "qty", "instock" ], properties: { item: { bsonType: "string" }, qty: { bsonType: "int" }, size: { bsonType: "object", required: [ "uom" ], properties: { uom: { bsonType: "string" }, h: { bsonType: "double" }, w: { bsonType: "double" } } }, instock: { bsonType: "bool" } } }
$jsonSchema
を使用すると、スキーマを満たすコレクション内のすべてのドキュメントを検索できます。
db.inventory.find( { $jsonSchema: myschema } ) db.inventory.aggregate( [ { $match: { $jsonSchema: myschema } } ] )
$jsonSchema
と$nor
を併用すると、スキーマを満たさないすべてのドキュメントを検索できます。
db.inventory.find( { $nor: [ { $jsonSchema: myschema } ] } )
あるいは、スキーマを満たさないすべてのドキュメントを更新することもできます。
db.inventory.updateMany( { $nor: [ { $jsonSchema: myschema } ] }, { $set: { isValid: false } } )
または、スキーマを満たさないすべてのドキュメントを削除できます。
db.inventory.deleteMany( { $nor: [ { $jsonSchema: myschema } ] } )
JSON Schema
MongoDB は、4 コア仕様 を含む JSON schema のドラフト をサポートしています および 検証仕様 、いくつか違いがあります。詳細については、拡張機能と省略を参照してください。
JSON schema の詳細については、 公式ウェブサイト を参照してください。 。
利用可能なキーワード
注意
MongoDB は、JSON schema で使用可能なキーワードのサブセットを実装します。 省略の完全なリストについては、「 省略 」を参照してください。
Keyword | タイプ | 定義 | 動作 |
---|---|---|---|
bsonType | すべての型 | 文字列エイリアスまたは文字列エイリアスの配列 | |
列挙 | すべての型 | 値の配列 | フィールドで使用可能なすべての値を列挙します |
タイプ | すべての型 | 文字列または一意の文字列の配列 | フィールドの使用可能な JSON タイプを列挙します。使用可能なタイプは、「オブジェクト」、「配列」、「数値」、「ブール値」、「文字列」、および「null」です。 MongoDB の JSON schema の実装では、「整数」型をサポートしていません。代わりに、 |
allOf | すべての型 | JSON schema オブジェクトの配列 | フィールドは指定されたすべてのスキーマと一致する必要があります |
anyOf | すべての型 | JSON schema オブジェクトの配列 | フィールドは指定されたスキーマの 1 つ以上と一致する必要があります |
oneOf | すべての型 | JSON schema オブジェクトの配列 | フィールドは指定されたスキーマの 1 つと正確に一致する必要があります |
ではない | すべての型 | JSON schema オブジェクト | フィールドはスキーマと一致しない必要があります |
multipleOf | 数値 | 数値 | フィールドは、この値の倍数である必要があります |
maximum | 数値 | 数値 | フィールドの最大値を示します |
exclusiveMaximum | 数値 | ブール値 | true でフィールドが数値の場合、 maximum は最大値(最大値を含まない)です。それ以外の場合は、最大値(最大値を含む)です。 |
minimum | 数値 | 数値 | フィールドの最小値を示します |
exclusiveMinimum | 数値 | ブール値 | true の場合、 minimum は最小値(最小値を含まない)です。それ以外の場合は、最小値(最小値を含む)です。 |
maxLength | string | integer | フィールドの最大長を示します |
minLength | string | integer | フィールドの最小長を示します |
パターン | string | 正規表現を含む文字列 | フィールドは正規表現と一致する必要があります |
maxProperties | オブジェクト | integer | フィールドのプロパティの最大数を示します |
minProperties | オブジェクト | integer | フィールドのプロパティの最小数を示します |
必須 | オブジェクト | 一意の文字列の配列 | オブジェクトのプロパティ セットには、配列内の指定された要素がすべて含まれている必要があります。 |
additionalProperties | オブジェクト | ブール値またはオブジェクト |
デフォルトは |
properties | オブジェクト | オブジェクト | 各値も有効な JSON schema オブジェクトである有効な JSON schema |
patternProperties | オブジェクト | オブジェクト | properties 要件に加えて、このオブジェクトの各プロパティ名は有効な正規表現である必要があります |
dependencies | オブジェクト | オブジェクト | フィールドまたはスキーマの依存関係を記述します |
additionalItems | 配列 | ブール値またはオブジェクト | オブジェクトの場合は、有効な JSON schema である必要があります |
items | 配列 | オブジェクトまたは配列 | 有効な JSON schema、または有効な JSON schema の配列である必要があります |
maxItems | 配列 | integer | 配列の最大長を示します |
minItems | 配列 | integer | 配列の最小長を示します |
uniqueItems | 配列 | ブール値 | true の場合、配列内の各項目は一意である必要があります。それ以外の場合は、一意制約は適用できません。 |
title | 該当なし | string | 影響のない記述的な表題用の文字列。 |
説明 | 該当なし | string | スキーマを説明し、影響を与えない string。 |
拡張機能
MongoDB のJSON schemaの実装には、 キーワードの追加が含まれており、これにより、bsonType
演算子ですべての BSON $jsonSchema
型を使用できます。bsonType
は、 $type
演算子に使用されるのと同じ string エイリアスを受け付けます。
省略
MongoDB の JSON schema の実装では、以下はサポートされていません。
ハイパーテキストの定義 4JSON schema 仕様のドラフト における。
以下のキーワード
$ref
$schema
default
definitions
format
id
integer
型。bsonType
キーワードとともに BSON 型のint
またはlong
を使用する必要があります。JSON schema のハイパーメディアおよびリンクするプロパティ(JSON リファレンスと JSON ポインターの使用を含む)。
不明なキーワード。