Specify JSON Schema Validation
JSON schema は、JSON ドキュメントに注釈を付けて検証するための語彙です。JSON schema を使用して、人間が判読できる形式でフィールドの検証ルールを指定できます。
互換性
JSON schema 検証は、次の環境でホストされている配置に使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
Context
MongoDB はいくつか違いはあるものの、コア仕様 および 検証仕様を含む JSON schema のドラフト 4 をサポートしています。詳細については、拡張機能と省略を参照してください。
JSON schema の詳細については、 公式ウェブサイト を参照してください。
制限事項
次のスキーマ検証は指定することはできません。
admin
データベース、local
データベース、config
データベースのコレクション
コレクションでクライアント側フィールドレベル暗号化またはQueryable Encryptionが有効になっている場合、検証は次の制限の対象となります。
collMod
の実行時に、libmongocrypt ライブラリは CSFLE に対して、このコマンドで指定される JSON 暗号化スキーマを優先します。これにより、まだスキーマがないコレクションにスキーマを設定できます。Queryable Encryption の場合、暗号化されたフィールドを含む JSON schema はクエリ分析エラーになります。
手順
この例では、検証ルールを含む students
コレクションを作成し、無効なドキュメントを挿入しようとした後の結果を確認します。
MongoDB 配置に接続します。
mongosh
を使用してローカル MongoDB インスタンスまたは MongoDB Atlas 配置に接続するには、「配置へのの接続」または「mongosh 経由での接続」の手順を参照してください。
検証を使用してコレクションを作成します。
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 はこれらのフィールドをエラー出力に記録します。
検証により無効なドキュメントを防止することを確認します。
次のコマンドを実行します。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("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' } ] } ] } ] } }
有効なドキュメントのクエリを実行します。
ドキュメントが正常に挿入されたことを確認するには、次のコマンドで 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
を使用して指定されます。
詳細
JSON schema で許可されるキーワードの完全なリストを確認するには、「使用可能なキーワード」を参照してください。
特定のフィールドに含めることができる値を制限するには、「許可されるフィールド値の指定」を参照してください。
JSON schema 検証の問題を回避するには、「JSON Schema 検証のヒント」を参照してください。