暗号化されたフィールドと有効なクエリ
Queryable Encryptionを使用する場合は、暗号化スキーマを使用してコレクションレベルで暗号化されたフィールドを定義します。 フィールドを暗号化してクエリを有効にすると、ストレージ要件が増加し、クエリのパフォーマンスに影響します。 暗号化されたフィールドは、等価クエリまたは範囲クエリのいずれかに構成できますが、両方を構成することはできません。 予想されるクエリタイプのフィールドを設定します。
暗号化スキーマの作成とクエリの構成の詳細については、「 暗号化スキーマの作成 」を参照してください。
サポートされているクエリの種類と動作
サポートされているクエリ演算子のリストと暗号化されたフィールドの動作については、サポートされているクエリ演算子 を参照してください。
クライアントとサーバーのスキーマバリデーション
MongoDB は、コレクション内の特定のフィールドの暗号化を強制するために、スキーマ検証を使用することをサポートしています。 自動 Queryable Encryption を使用するクライアントの動作は、データベース接続構成によって異なります。
接続
encryptedFieldsMap
オブジェクトに指定されたコレクションのキーが含まれている場合、クライアントは リモートスキーマではなく、そのオブジェクトを使用して自動Queryable Encryptionを実行します。 少なくとも、ローカル ルールはリモートスキーマが行うすべてのフィールドを暗号化する必要があります。接続
encryptedFieldsMap
オブジェクトに指定されたコレクションのキーが含まれていない場合、クライアントはコレクションのサーバー側リモート スキーマをダウンロードし、代わりにそれを使用します。重要
リモート スキーマの動作
リモート スキーマを使用する場合:
クライアントはサーバーが有効な スキーマ があることを信頼している
クライアントはリモート スキーマを使用して自動 Queryable Encryption のみを実行します。 クライアントは、スキーマで指定された他の検証ルールを強制しません。
クエリを有効にする際の考慮事項
暗号化されたフィールドをクエリ可能にすることができます。 暗号化される、またはクエリ可能なフィールドを変更するには、コレクションの暗号化スキーマを再ビルドし、コレクションを再作成します 。
暗号化されたフィールドをクエリする必要がない場合は、そのフィールドでクエリを有効にする必要がない場合があります。 クエリ可能なフィールドや暗号化されていない他のフィールドをクエリすることで、ドキュメントを検索することもできます。
MongoDBは 暗号化されたコレクションごとに2 つのメタデータのコレクションを作成し、ストレージ容量を増やします。 MongoDBは 暗号化されたフィールドごとにインデックスを作成し、そのフィールドの書込み (write) 操作の期間を増やします。 書込み操作によってインデックス付きフィールドが更新されると、 MongoDBは関連するインデックスを更新します。
最適な検索とストレージのための暗号化フィールドの設定
MongoDBは、デバッグやパフォーマンスの調整を容易にするために次のパラメーターを提供します。
min, max
クエリ タイプ: 範囲クエリのみ。
タイプ: フィールドの
bsonType
と一致する必要があります。bsonType
がdecimal
またはdouble
の場合は必須です。 任意ですが、int
、long
、またはdate
の場合は強く推奨します。 デフォルトはbsonType
の最小値と最大値です。限界が小さいとクエリの効率が向上するため、可能な場合はフィールドのクエリ可能な最小値と最大値(この値を含む)を指定します。 これらの範囲外の値をクエリすると、 MongoDBはエラーを返します。
重要
sparsity
クエリ タイプ: 範囲クエリのみ。
タイプ:
1
-4
の整数。任意。デフォルトは
2
です。MongoDBが範囲値を十分にインデックス化するかに影響します。 スパース度が低いほど(高密度のインデックスを作成)クエリのパフォーマンスは向上しますが、挿入またはアップデートの操作ごとに暗号化されたメタデータコレクションに保存されるドキュメントが増え、ストレージのオーバーヘッドが大きくなります。 スパース度が高い場合は、その逆も発生します。
precision
クエリ タイプ: 範囲クエリのみ。
タイプ: 整数。
任意。
bsonType
がdouble
またはdecimal
の場合にのみ許可されます。設定されていない場合、 MongoDBはbsonType
と同じ最大精度(double
またはdecimal
のいずれか)を使用します。double
またはdecimal
フィールドをクエリするときに考慮される桁数を決定します。数字を追加するたびにストレージのオーバーヘッドが増加し、検索可能な範囲とインデックス生成に大きな影響を与えます。 このパラメーターは、範囲クエリの精度を制限します。precision
の値が異なる場合はクエリ出力に影響しますが、暗号化された値は引き続き完全な精度で保存されます。
trimFactor
クエリ タイプ: 範囲クエリのみ。
タイプ: 整数。
任意。デフォルトは
6
です。trimFactor
は、同時挿入および更新のスループットを制御します。trimFactor
が大きいと、同時挿入および更新のスループットは向上しコストが、範囲読み取り操作は遅くなります。値が低いtrimFactor
は、その逆を行います。
contention
クエリ タイプ: 等価クエリと範囲クエリ
タイプ: 整数。
任意。デフォルトは
8
です。同じフィールドと値のペアを連続して複数のドキュメントに挿入するなどの同時書込み操作では、競合(競合)が発生し、操作が遅延する可能性があります。
Queryable Encryptionを使用すると、 MongoDBは内部カウンターを使用して、暗号化されたコレクション内の各フィールドと値のペアの発生を追跡します。 競合係数は、配列のようにこのカウンターを分割します。 これにより、
insert
、update
、またはfindAndModify
を使用して、同じフィールドと値のペアが連続して含まれる暗号化されたフィールドを追加または変更するときに、カウンターの増加に関する問題を最小限に抑えられフィールド。contention = 0
はインデックス0に 1 つの要素を含む配列を作成します。contention = 4
は、インデックス0 - 4に5要素を含む配列を作成します。 MongoDBは、挿入中にランダムな配列要素を増加させます。設定されていない場合、
contention
はデフォルトで8
になり、ほとんどのワークロードで高パフォーマンスが提供されます。 コンテンツが大きいと、濃度の低いフィールドで挿入およびアップデート操作のパフォーマンスは向上しますが、検索パフォーマンスは低下します。オプションで、クエリ可能なフィールドに
contention
を含めて、値をデフォルトの8
から変更できます。競合係数とその暗号化への影響の詳細については、9 MongoDBQueryable EncryptionMongoDBのQueryable Encryptionテクニカル ペーパー の 「セクション: ガイドライン」 を参照してください。