ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

Specify JSON Schema Validation

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

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

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

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

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

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

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

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

コレクションでクライアント側フィールドレベル暗号化または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.discountedPricelineItems.price 未満である必要があります。このルールは $lt 演算子を使用して指定されます。

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