クエリ演算子による検証を指定する
$eq
や$gt
などのクエリ演算子を使用して検証を指定し、フィールドを比較できます。
クエリ演算子によるスキーマ検証の一般的なユースケースは、実行時に複数のフィールド値を比較する動的検証ルールを作成する場合です。 たとえば、別のフィールドの値に依存するフィールドがあり、それらの値が互いに正しく比例していることを確認する必要がある場合。
制限事項
validator
オブジェクトでは次のクエリ演算子を指定できません。次のスキーマ検証は指定することはできません。
admin
データベース、local
データベース、config
データベースのコレクション
Context
カスタマーの注文を追跡するアプリケーションを考えてみましょう。 注文には基本価格と VATが含まれます。 orders
コレクションには、合計価格を追跡するための次のフィールドが含まれています。
price
VAT
totalWithVAT
手順
次の手順では、クエリ演算子を使用してスキーマ検証を作成し、 totalWithVAT
がprice
とVAT
の予想される組み合わせと一致することを確認します。
検証により無効なドキュメントを防止することを確認します。
totalWithVAT
フィールドが正しい値と等しくないため、次の操作は失敗します。
db.orders.insertOne( { total: NumberDecimal("141"), VAT: NumberDecimal("0.20"), totalWithVAT: NumberDecimal("169") } )
141 *( 1 + 0.20 )は169.2と等しいため、 totalWithVAT
フィールドの値は169.2である必要があります。
この操作は、次のエラーを返します。
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("62bcc9b073c105dde9231293"), details: { operatorName: '$expr', specifiedAs: { '$expr': { '$eq': [ '$totalWithVAT', { '$multiply': [ '$total', { '$sum': [ 1, '$VAT' ] } ] } ] } }, reason: 'expression did not match', expressionResult: false } }
詳細情報
クエリ演算子の検証と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
を使用して指定されます。
詳細
MongoDB で使用できるすべてのクエリ演算子を確認するには、「クエリ セレクター 」を参照してください。
クエリ言語内で集計式を使用できる
$expr
演算子について詳しくは、$expr
をご覧ください。