JSON schema は、JSON ドキュメントに注釈を付けて検証するための語彙です。JSON schema を使用して、人間が判読できる形式でフィールドの検証ルールを指定できます。
Context
MongoDB はいくつか違いはあるものの、 コア仕様 および 検証仕様 4を含むJSON schema のドラフト をサポートしています。詳細については、「 拡張機能と省略 」を参照してください。
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' } ] } ] } ] } }
Tip
デフォルトでは、 mongoshは最大 6 レベルの深さのネストされたオブジェクトを出力します。 ネストされたすべてのオブジェクトを完全な深度で出力するには、 inspectDepthをInfinityに設定します。
config.set("inspectDepth", Infinity)
有効なドキュメントのクエリを実行します。
ドキュメントが正常に挿入されたことを確認するには、次のコマンドで 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 検証のヒント」を参照してください。