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

$jsonSchema

項目一覧

  • 定義
  • 動作
  • JSON Schema
$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 でサポートされているキーワードのリストについては、「使用可能なキーワード 」を参照してください。

注意

MongoDB は、4 コア仕様 を含む JSON schema のドラフト をサポートしています および 検証仕様 、いくつか違いがあります。詳細については、拡張機能省略を参照してください。

JSON schema の詳細については、 公式ウェブサイト を参照してください。 。

を使用するには、 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の場合、 validatordoubleが必要な場合、 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 } ] } )

MongoDB は、4 コア仕様 を含む JSON schema のドラフト をサポートしています および 検証仕様 、いくつか違いがあります。詳細については、拡張機能省略を参照してください。

JSON schema の詳細については、 公式ウェブサイト を参照してください。 。

注意

MongoDB は、JSON schema で使用可能なキーワードのサブセットを実装します。 省略の完全なリストについては、「 省略 」を参照してください

Keyword
タイプ
定義
動作
bsonType
すべての型
文字列エイリアスまたは文字列エイリアスの配列
$type 演算子で使うものと同じ 文字列エイリアスを受け付けます
列挙
すべての型
値の配列
フィールドで使用可能なすべての値を列挙します
タイプ
すべての型
文字列または一意の文字列の配列

フィールドの使用可能な JSON タイプを列挙します。使用可能なタイプは、「オブジェクト」、「配列」、「数値」、「ブール値」、「文字列」、および「null」です。

MongoDB の JSON schema の実装では、「整数」型をサポートしていません。代わりに、 bsonType キーワードならびに「int」型または「long」型を使用してください。

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
オブジェクト
ブール値またはオブジェクト

true の場合、追加のフィールドが使用できます。false の場合は使用できません。有効な JSON schema オブジェクトを指定した場合、スキーマに対して追加のフィールドを検証する必要があります。

デフォルトは true です。

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 ポインターの使用を含む)。

  • 不明なキーワード。

戻る

$expr