Queryable Encryptionを使用する場合は、暗号化スキーマを使用してコレクションレベルで暗号化されたフィールドを定義します。 フィールドを暗号化してクエリを有効にすると、ストレージ要件が増加し、クエリのパフォーマンスに影響します。 暗号化されたフィールドは、等価クエリまたは範囲クエリのいずれかに構成できますが、両方を構成することはできません。 予想されるクエリタイプのフィールドを設定します。
暗号化スキーマの作成とクエリの構成については、「暗号化化スキーマの作成 」を参照してください。
サポートされているクエリの種類と動作
サポートされているクエリ演算子のリストと暗号化されたフィールドの動作については、サポートされているクエリタイプと演算子を参照してください。
スキーマ検証
Queryable Encryptionでは、コレクション内の特定のフィールドの暗号化を強制するために、サーバー側の暗号化スキーマが必要です。自動Queryable Encryptionを使用するクライアントの動作は、データベース接続構成によって異なります。
少なくとも、ローカル ルールはサーバー上のリモートスキーマと同じフィールドを暗号化する必要があります。
接続
encryptedFieldsMapオブジェクトに指定されたコレクションのキーが含まれている場合、クライアントはリモートスキーマではなく、そのオブジェクトを使用して自動Queryable Encryptionを実行します。接続
encryptedFieldsMapオブジェクトに指定されたコレクションのキーが含まれていない場合、クライアントはコレクションのリモートスキーマをダウンロードし、代わりに使用します。重要
リモート スキーマの動作
リモート スキーマを使用する場合:
クライアントはサーバーが有効な スキーマ があることを信頼している
クライアントはリモート スキーマを使用して自動 Queryable Encryption のみを実行します。 クライアントは、スキーマで指定された他の検証ルールを強制しません。
クエリを有効にする際の考慮事項
コレクションを作成する 前に、どのフィールドを暗号化したり、クエリ可能にしたりするかを決定してください。どのフィールドが暗号化されているか、またはクエリ可能であるかを変更するには、コレクションの暗号化スキーマを再構築し、コレクションを再作成する 必要があります。
暗号化されたフィールドをクエリする必要がない場合は、そのフィールドでクエリを有効にする必要がない場合があります。 クエリ可能なフィールドや暗号化されていない他のフィールドをクエリすることで、ドキュメントを検索することもできます。
MongoDBは 暗号化されたコレクションごとに2 つのメタデータのコレクションを作成し、ストレージ容量を増やします。 MongoDBは 暗号化されたフィールドごとにインデックスを作成し、そのフィールドの書込み (write) 操作の期間を増やします。 書込み操作によってインデックス付きフィールドが更新されると、 MongoDBは関連するインデックスを更新します。
最適な検索とストレージのための暗号化フィールドの設定
MongoDBでは、パフォーマンスのチューニングやデバッグを容易にするために、以下のパラメータを提供しています。
min, maxクエリタイプ:
rangeタイプ: フィールドの
bsonTypeと一致する必要があります。Required if setting precision. Otherwise optional, but highly recommended. Defaults to the
bsonTypemin and max values.限界が小さいとクエリの効率が向上するため、可能な場合はフィールドのクエリ可能な最小値と最大値(この値を含む)を指定します。 これらの範囲外の値をクエリすると、 MongoDBはエラーを返します。
プレフィックス、サフィックス、およびサブストリングのパラメーター
strMaxLengthクエリタイプ:
substringタイプ: 2から50までの整数(両端を含む)
必須。サブストリングインデックスフィールドの許容される最大長さ。より長い string を挿入しようとするとエラーが返されます。
strMinQueryLengthクエリタイプ:
prefix、suffix、substringタイプ: 正の整数。
prefixまたはsuffixクエリでは >= 1 である必要があります。substringクエリでは >= 2 である必要があります。
必須。クエリ可能なプレフィックス、サフィックス、またはサブストリングの最小長。これより短いstringをクエリしようとすると、エラーが返されます。
strMaxQueryLengthクエリタイプ:
prefix、suffix、substringタイプ: 正の整数。
prefixまたはsuffixクエリでは >= 1 である必要があります。substringクエリの場合、2 から 6 の範囲内である必要があります。
必須。クエリ可能なプレフィックス、サフィックス、またはサブストリングの最大許容長。これより長いstringをクエリしようとすると、エラーが返されます。
重要
この設定はクエリのパフォーマンスに大きく影響します。可能な場合は常に最大クエリ長を制限します。
高度なクエリ パラメーター
警告
これらのパラメーターは上級ユーザーのみを対象としたものです。デフォルト値は過半数のユースケースに適しており、ユースケースで必要な場合にのみ変更してください。
sparsityクエリタイプ:
rangeタイプ: 1 - 8の整数。
任意。デフォルトは 2 です。
MongoDBが範囲値を十分にインデックス化するかに影響します。 スパース度が低いほど(高密度のインデックスを作成)クエリのパフォーマンスは向上しますが、挿入またはアップデートの操作ごとに暗号化されたメタデータコレクションに保存されるドキュメントが増え、ストレージのオーバーヘッドが大きくなります。 スパース度が高い場合は、その逆も発生します。
バージョン8.2での変更:
最大値が 4 から 8 に変更されました。
precisionクエリタイプ:
rangeタイプ: 整数。
任意。
bsonTypeがdoubleまたはdecimalの場合にのみ許可されます。設定されていない場合、 MongoDBはbsonTypeと同じ最大精度(doubleまたはdecimalのいずれか)を使用します。doubleまたはdecimalフィールドをクエリするときに考慮される点以降の桁数を制限します。追加の桁は丸められずに削除されます。例、1 のprecisionはクエリで10.18を10.1として扱います。暗号化された値は引き続き10.18として保存されます。precisionを指定し、可能な場合は制限します。数字が 関係 のようにストレージのオーバーヘッドが増加するため、検索可能な範囲とインデックス生成に大きな影響が生じます。
trimFactorクエリタイプ:
rangeタイプ: 整数。
任意。デフォルトは 6 です。
trimFactorは、同時挿入および更新のスループットを制御します。trimFactorが大きいと、同時挿入および更新のスループットは向上しコストが、範囲読み取り操作は遅くなります。値が低いtrimFactorは、その逆を行います。
contentionクエリタイプ:
equality、range、prefix、suffix、substringタイプ: 整数。
自動暗号化の場合は任意。デフォルトは 8 です。明示的な暗号化には必須です。
同じフィールドと値のペアを連続して複数のドキュメントに挿入するなどの同時書込み操作では、競合(競合)が発生し、操作が遅延する可能性があります。
Queryable Encryptionを使用すると、 MongoDBは内部カウンターを使用して、暗号化されたコレクション内の各フィールドと値のペアの発生を追跡します。 競合係数は、配列のようにこのカウンターを分割します。 これにより、
insert、update、またはfindAndModifyを使用して、同じフィールドと値のペアが連続して含まれる暗号化されたフィールドを追加または変更するときに、カウンターの増加に関する問題を最小限に抑えられフィールド。contention = 0はインデックス0に 1 つの要素を含む配列を作成します。contention = 4は、インデックス0 - 4に5要素を含む配列を作成します。 MongoDBは、挿入中にランダムな配列要素を増加させます。設定されていない場合、
contentionはデフォルトで8になり、ほとんどのワークロードで高パフォーマンスが提供されます。 コンテンツが大きいと、濃度の低いフィールドで挿入およびアップデート操作のパフォーマンスは向上しますが、検索パフォーマンスは低下します。For more thorough information on contention factor and its cryptographic implications, see "Section 9: Guidelines" in MongoDB's Queryable Encryption Technical Paper.