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

Specify JSON Schema Validation

項目一覧

  • 互換性
  • Context
  • 制限事項
  • 手順
  • 詳細情報
  • 詳細

JSON schema は、JSON ドキュメントに注釈を付けて検証するための語彙です。JSON schema を使用して、人間が判読できる形式でフィールドの検証ルールを指定できます。

JSON schema 検証は、次の環境でホストされている配置に使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

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

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

次のスキーマ検証は指定することはできません。

  • admin データベース、local データベース、config データベースのコレクション

  • システム コレクション

コレクションでクライアント側フィールドレベル暗号化またはQueryable Encryptionが有効になっている場合、検証は次の制限の対象となります。

  • collMod の実行時に、libmongocrypt ライブラリは CSFLE に対して、このコマンドで指定される JSON 暗号化スキーマを優先します。これにより、まだスキーマがないコレクションにスキーマを設定できます。

  • Queryable Encryption の場合、暗号化されたフィールドを含む JSON schema はクエリ分析エラーになります。

この例では、検証ルールを含む students コレクションを作成し、無効なドキュメントを挿入しようとした後の結果を確認します。

1

mongosh を使用してローカル MongoDB インスタンスまたは MongoDB Atlas 配置に接続するには、「配置へのの接続」または「mongosh 経由での接続」の手順を参照してください。

2

mongoshでは、次のコマンドを実行してstudentsコレクションを作成し、 $jsonSchema演算子を使用してスキーマ検証ルールを設定します。

db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
title: "Student Object Validation",
required: [ "address", "major", "name", "year" ],
properties: {
name: {
bsonType: "string",
description: "'name' must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "'year' must be an integer in [ 2017, 3017 ] and is required"
},
gpa: {
bsonType: [ "double" ],
description: "'gpa' must be a double if the field exists"
}
}
}
}
} )

Tip

Title フィールドと Description フィールドでルールを明確化

検証ルールがすぐに明確にならない場合は、title フィールドと description フィールドを使用して検証ルールを説明できます。ドキュメントの検証に失敗した場合、MongoDB はこれらのフィールドをエラー出力に記録します。

3

次のコマンドを実行します。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("630d093a931191850b40d0a9"),
details: {
operatorName: '$jsonSchema',
title: 'Student Object Validation',
schemaRulesNotSatisfied: [
{
operatorName: 'properties',
propertiesNotSatisfied: [
{
propertyName: 'gpa',
description: "'gpa' must be a double if the field exists",
details: [
{
operatorName: 'bsonType',
specifiedAs: { bsonType: [ 'double' ] },
reason: 'type did not match',
consideredValue: 3,
consideredType: 'int'
}
]
}
]
}
]
}
}

Tip

デフォルトでは、 mongoshは最大 6 レベルの深さのネストされたオブジェクトを出力します。 ネストされたすべてのオブジェクトを完全な深度で出力するには、 inspectDepthInfinityに設定します。

config.set("inspectDepth", Infinity)
4

gpa フィールドの値を double タイプに変更すると、挿入操作は成功します。有効なドキュメントを挿入するには、次のコマンドを実行します。

db.students.insertOne( {
name: "Alice",
year: NumberInt(2019),
major: "History",
gpa: Double(3.0),
address: {
city: "NYC",
street: "33rd Street"
}
} )
5

ドキュメントが正常に挿入されたことを確認するには、次のコマンドで students コレクションのクエリを実行します。

db.students.find()
[
{
_id: ObjectId("62bb413014b92d148400f7a5"),
name: 'Alice',
year: 2019,
major: 'History',
gpa: 3,
address: { city: 'NYC', street: '33rd Street' }
}
]

Tip

Atlas 配置に接続している場合、Atlas UI でのドキュメントの表示とフィルタリングも可能になりました。

JSON schema 検証とクエリ演算子の検証を組み合わせることができます。

例として、こちらのスキーマ検証を含む sales コレクションを考えます。

db.createCollection("sales", {
validator: {
"$and": [
// Validation with query operators
{
"$expr": {
"$lt": ["$lineItems.discountedPrice", "$lineItems.price"]
}
},
// Validation with JSON Schema
{
"$jsonSchema": {
"properties": {
"items": { "bsonType": "array" }
}
}
}
]
}
}
)

上記の検証により、sales コレクション内のドキュメントに対して次のルールが強制されます。

  • lineItems.discountedPrice は、lineItems.price 未満である必要があります。このルールは、$lt 演算子を使用して指定されます。

  • items フィールドは配列である必要があります。このルールは、$jsonSchema を使用して指定されます。

戻る

スキーマ検証