受信クエリのフィルタリング
Overview
フィルターは、受信 MongoDB クエリを変更して、クエリに一致する結果のサブセットのみを返すようにします。コレクションにフィルターを追加すると、クエリされたドキュメントの形状を制御し、クエリのパフォーマンスを向上させることができます。
フィルタはクエリパラメータを追加し、Atlas App Services がクエリを実行する前にクエリ結果からフィールドを除外します。すべてのフィルターには3つの要素があります。
フィルターが受信リクエストに適用されるかどうかを決定する"apply when"式。 "apply when" 式では、
%%user
や%%request
などの変数を使用できます。 ただし、App Services はドキュメントを読み取る前に "apply when" 式を評価するため、%%root
のようなドキュメントを参照する展開は使用できません。オプションのクエリ式は、フィルターが適用されるリクエストの既存のクエリと結合されます。
オプションのプロジェクション ドキュメント。標準の MongoDB プロジェクション構文を使用し、フィルターが適用されるすべてのリクエストの既存のプロジェクションと統合します。
App Services によるフィルターの適用方法
Atlas App Services は、ルールが適用されるすべての MongoDB リクエスト(Device Sync リクエストを除く)に対してフィルターを評価して適用します。フィルタ可能な MongoDB リクエストの例は次のとおりです。
コレクションに対するクエリ。
ドキュメントへの書き込み。
フィルターは、そのリクエストのコンテキストに応じて "apply when" 式が true と評価された場合に、特定のリクエストに適用されます。フィルターがリクエストに適用される場合、App Services はフィルターのクエリまたはプロジェクションを、リクエストされた操作の既存のクエリおよびプロジェクションに統合します。
1 つのリクエストに複数のフィルターを適用できます。
App Services はリクエストをMongoDBに送信する前に、リクエストにフィルタを適用します。
例
コレクションには数百万のドキュメントが含まれており、 "apply when" 式が適用されるロールが 1 つあります。
{ "owner_id": "%%user.id" }
フィルターが適用されていない場合、App Services はクエリに一致する各ドキュメントのロールを評価します。App Services は、 owner_id
フィールドの値としてユーザーの ID を持たないドキュメントの保留を認識しており、App Services がロールを評価する前にそれらのドキュメントを除外する追加のクエリ述語を適用することで、時間とコンピューティング リソースを節約します。
Apply When | クエリ | プロジェクション |
---|---|---|
{ "%%true": true } | { "owner_id": "%%user.id" } | {} |
フィルターを定義する
フィルターを使用すると、クエリを最適化し、コンピューティングのオーバーヘッドを最小限に抑え、機密データを保護できます。フィルターは、クエリの一部またはすべてに影響する横断的な問題に最も役立ちます。
集中型システムで次のことを実現したい場合は、フィルターの使用を検討してください。
クエリをすべてのドキュメントのサブセットに制限する
機密データや未使用のフィールドを省略する
例
一部のユーザーが匿名で投票を共有することに同意した投票アプリでは、次のフィルターを使用して、すべてのクエリを既存のデータの匿名のサブセットに制限できます。
{ "name": "AnonymizeVotes", "apply_when": true, "query": { "shareVoteAnonymous": true }, "project": { "_id": 0, "age": 1, "vote": 1 } }
{ "_id": ObjectId(...), "name": "sarah", age: 42, "vote": "yes", "shareVoteAnonymous": true } { "_id": ObjectId(...), "name": "andy", age: 22, "vote": "no", "shareVoteAnonymous": true } { "_id": ObjectId(...), "name": "jennifer", age: 37, "vote": "yes", "shareVoteAnonymous": false } { "_id": ObjectId(...), "name": "rick", age: 43, "vote": "no", "shareVoteAnonymous": true } { "_id": ObjectId(...), "name": "tom", age: 64, "vote": "yes", "shareVoteAnonymous": false } { "_id": ObjectId(...), "name": "bob", age: 67, "vote": "yes", "shareVoteAnonymous": true }
{ age: 42, "vote": "yes" } { age: 22, "vote": "no" } { age: 37, "vote": "yes" } { age: 43, "vote": "no" } { age: 64, "vote": "yes" } { age: 67, "vote": "yes" }
手順
リンクされたクラスター内の特定のコレクションのフィルターは、App Services UI から、または Realm CLI を使用して設定ファイルを配置することで定義できます。
注意
このガイドでは、リンクされたMongoDB Atlas データ ソースが必要です。
Apply When 式の指定
Apply When入力ボックスに、フィルターがクエリに適用されるタイミングを定義するルール式を入力します。受信クエリに対して式がtrue
と評価された場合、App Services は受信クエリにFilter Queryパラメーターを追加します。
重要
Atlas App Services はドキュメントを読み取る前にフィルターを評価して適用するため、フィルターの Apply When 式でMongoDB ドキュメント展開を使用することはできません。ただし、 %%user
、 %%values
、 %function
などの他の展開を使用することはできます。
フィルタープロジェクションの指定
Projection入力ボックス内に、フィルターが適用されたときに受信クエリにマージするプロジェクションドキュメントを含むドキュメントを指定します。
例えば、career_stats
フィールドと personal
フィールドをドキュメントから除外するフィルターでは、次のフィルタープロジェクションを使用できます。
{ "career_stats": 0, "personal": 0 }
ルール設定ファイルの追加
コレクションのロールを定義または変更するには、コレクションの設定ディレクトリ内の rules.json
設定ファイルを開きます。
Tip
コレクションの足場
コレクションのルールやスキーマをまだ定義していない場合は、その設定ディレクトリと schema.json
を手動で作成する必要があります。
# Create the collection's configuration directory mkdir -p data_sources/<service>/<db>/<collection> # Create the collection's schema file echo '{}' >> data_sources/<service>/<db>/<collection>/rules.json
構成ファイルは、次の一般的な形式でなければなりません。
{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [], "filters": [] }
注意
このガイドでは、コレクションのfilters
の作成に焦点を当てています。ロールと権限を定義し、スキーマを強制する方法については、他の構成ガイドを参照してください。
注意
フェデレーティッド データソースは、ルールまたは スキーマ をサポートしていません。 フェデレーティッド データソースには、システム関数からのみアクセスできます。
1つ以上のフィルターを追加する
設定するフィルターごとに、 filters
配列にドキュメントを追加します。フィルター ドキュメントの形式は次のとおりです。
{ "name": "<Filter Name>", "apply_when": { Expression }, "query": { MongoDB Query }, "projection": { MongoDB Projection } }
フィールド | 説明 | |
---|---|---|
name string | 必須。 フィルターの名前。 フィルター名は、フィルターを識別して区別するのに役立ちます。 100 文字以下に制限します。 | |
apply_when object | このフィルターが受信 MongoDB 操作に適用されるタイミングを決定する式。 重要Atlas App Services はドキュメントを読み取る前にフィルターを評価して適用するため、フィルターの Apply When 式でMongoDB ドキュメント展開を使用することはできません。ただし、 | |
query object Default: {} | App Services がフィルタリングされた操作の既存のクエリにマージするMongoDB クエリ。 例フィルターは、次のクエリを使用して、
| |
projection object Default: {} | App Services がフィルタリングされた操作の既存のプロジェクションに統合するMongoDB プロジェクション。 重要プロジェクションの競合MongoDB プロジェクションには包括的と排他的のいずれかのプロジェクションががあります。つまり、指定されたフィールドのみを返すか、指定されていないフィールドを除外することができます。 クエリに複数のフィルターを適用する場合、フィルターはすべて同じプロジェクション タイプを指定する必要があります。そうしないと、クエリは失敗します。 例フィルターは、次のプロジェクションを使用するすべてのドキュメントから
|
注意
App Services フィルターのセキュリティに関する考慮事項
ロールベースの権限とフィルターで、コレクション内の特定のドキュメントとフィールドを隠すことができますが、システムが任意のクエリによるコレクションへのアクセスを許可している場合、データが意図せず表示される可能性があります。
たとえば、コレクションに格納されている値に応じてエラー(ゼロ除算エラーなど)を発生させるクエリまたは関数は、ロールまたはフィルターによる制限でクエリ元のユーザーがドキュメントを直接表示できない場合でも、ドキュメントに関する情報を表示することがあります。ユーザーは、他の方法(データの分布に影響を受ける可能性のあるクエリの実行時間を測定するなど)で基礎となるデータについて推論することもできます。
この可能性を認識し、必要に応じてデータアクセス パターンを監査してください。