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