Schemas
Overview
スキーマとは?
スキーマは、データの構造と内容を定義する JSON オブジェクトです。 Atlas App Services の BSON スキーマを使用できます。これは JSON schema を拡張します 標準、アプリケーションのデータモデルを定義し、ドキュメントが作成、変更、または削除されるたびにドキュメントを検証します。
スキーマは特定の値ではなく、データの型を表します。App Services は、多くの組み込みスキーマ タイプをサポートしています。これらには、文字列や数値などのプリミティブや、オブジェクトや配列などの構造型が含まれ、これらを組み合わせてカスタム オブジェクト タイプを表すスキーマを作成できます。
たとえば、これは自動車に関するデータと、そのスキーマに準拠する一部の自動車オブジェクトの基本的なスキーマです。
{ "title": "car", "required": [ "_id", "year", "make", "model", "miles" ], "properties": { "_id": { "bsonType": "objectId" }, "year": { "bsonType": "string" }, "make": { "bsonType": "string" }, "model": { "bsonType": "string" }, "miles": { "bsonType": "number" } } }
{ "_id": ObjectId("5af712eff26b29dc5c51c60f"), "year": "2017", "make": "Honda", "model": "Civic", "miles": 117424 } { "_id": ObjectId("5af714eff24b294c5251cf04"), "year": "2020", "make": "Ford", "model": "Mustang", "miles": 13579 }
スキーマを定義する理由
スキーマは、アプリケーションのデータモデルの仕様です。スキーマを定義すると、App Services はスキーマに準拠したデータを処理するための追加のツールとサービスを提供します。
App Services は、多くのアプリケーション・サービスでスキーマを使用しています。
Atlas Device Sync はスキーマを使用して、Realm と MongoDB Atlas 間でデータを同期します。App Services では、スキーマに基づいて慣用的な SDK オブジェクトモデルを生成することもできます。
データアクセス ルールは、すべてのリクエストの前後でデータがスキーマに準拠していることを検証します。いずれかのドキュメントが検証に失敗した場合、App Services はリクエスト全体を阻止またはロールバックします。
スキーマを定義する
ルートレベルのコレクション スキーマには、型のプロパティを記述する追加のスキーマを含めることができます。各ルート レベル スキーマは、次の形式を持つ object
スキーマです。
{ "bsonType": "object", "title": "<Type Name>", "required": ["<Required Field Name>", ...], "properties": { "<Field Name>": <Schema> } }
サポートされているスキーマ タイプのいずれかを使用して、オブジェクトのプロパティを構成できます。
注意
アプリにスキーマを設定して配置する方法については、スキーマの定義および強制を参照してください。
App Services でスキーマを強制する方法
App Services は、MongoDB コレクションに対するすべての書込み操作(挿入、更新、削除)を、そのコレクション スキーマに対して検証します。すべてのリクエストの前後にすべてのドキュメントをチェックして、すべてのプロパティがスキーマに準拠していること、および無効な変更が発生していないか確認します。
App Services は、クラスターに書き込みをコミットする前に、すべてのドキュメント書込み (write)の結果を評価し、スキーマと比較します。リクエスト内の書込み操作の結果がスキーマと一致しない場合、App Services はリクエストの変更を適用せずにユーザーにエラーを返します。
例
コレクションには、次のスキーマがあります。
{ "title": "person", "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
すべてのフィールドの読み取りと書き込みの権限を持つユーザーが、特定のドキュメントのname
フィールドを更新したいと考えています。その場合、次のクエリを発行します。
collection.updateOne( { "_id": BSON.ObjectId("5ae782e48f25b9dc5c51c4d0") }, { "$set": { "name": 42 } } )
クエリは name
の値を 42
に設定しようとしますが、スキーマでは値が string
である必要があります。App Services は、ユーザーがドキュメントを更新する権限を持っていても、書き込み結果がスキーマに準拠していないため、この書き込み操作を拒否します。
App Services Schema と組み込みスキーマ検証の比較
App Services のスキーマは MongoDB に組み込まれているスキーマ検証と同一ではありません。どちらも、BSON types 向け追加サポートで標準装備されている JSON schema を使用しますが、App Services ではクラスターの組み込みスキーマが使用されないため、当該クラスターとのやり取りは組み込みスキーマと互換しない場合があります。
App Services スキーマおよびクラスターの組み込みスキーマ検証を同時に使用する場合は、次の点を考慮してください。
最初にクラスターのスキーマ検証レベルを「警告」に設定します。アクティビティを監視し、既存の警告に対処します。両方のスキーマ検証レイヤーに互換性があることを確認したら、検証レベルを「エラー」にアップグレードできます。
Device Sync を使用している場合は、埋め込みドキュメントおよび埋め込みドキュメントの配列の必須フィールドを避けます。同期プロトコルでは、有効な埋め込みオブジェクトの書き込みが、すべての必須フィールドを個別に含まない複数の同等の書き込みに分割される場合があります。
Device Sync を使用している場合は、
undefined
、null
、空の配列、フィールドのない埋め込みオブジェクトを区別しないようにします。同期プロトコルでは、これらの値を機能的に同等なものとして扱います。
両方のスキーマ検証レイヤーを同時に操作する際にサポートが必要な場合は、MongoDB サポートにお問い合わせください。