JSON schema は、 JSONドキュメントに注釈を付けて検証するための語彙です。JSON schema を使用して、人間が判読できる形式でフィールドの検証ルールを指定します。
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 はこれらのフィールドをエラー出力に記録します。
有効なドキュメントのクエリを実行します。
ドキュメントが正常に挿入されたことを確認するには、次のコマンドで students コレクションのクエリを実行します。
db.students.find()
[ { _id: ..., 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 検証のヒント」を参照してください。