Docs Menu
Docs Home
/ /
Atlas App Services
/

受信クエリのフィルタリング

項目一覧

  • Overview
  • App Services によるフィルターの適用方法
  • フィルターを定義する
  • 手順

フィルターは、受信 MongoDB クエリを変更して、クエリに一致する結果のサブセットのみを返すようにします。コレクションにフィルターを追加すると、クエリされたドキュメントの形状を制御し、クエリのパフォーマンスを向上させることができます。

フィルタはクエリパラメータを追加し、Atlas App Services がクエリを実行する前にクエリ結果からフィールドを除外します。すべてのフィルターには3つの要素があります。

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 データ ソースが必要です。

1

左側のナビゲーション メニューの Data Accessの下で、 Rulesをクリックします。

2

Rulesメニューからフィルターを構成するコレクションを選択し、 Filtersタブをクリックします。Add a Filterをクリックし、新しいフィルターにFilter Name を入力します。

3

Apply When入力ボックスに、フィルターがクエリに適用されるタイミングを定義するルール式を入力します。受信クエリに対して式がtrueと評価された場合、App Services は受信クエリにFilter Queryパラメーターを追加します。

入力スクリーンショット時にフィルターを適用

重要

Atlas App Services はドキュメントを読み取る前にフィルターを評価して適用するため、フィルターの Apply When 式でMongoDB ドキュメント展開を使用することはできません。ただし、 %%user%%values%functionなどの他の展開を使用することはできます。

4

Query 入力ボックス内で、フィルターが適用されたときに入力クエリにマージする追加のクエリ述語を含むドキュメントを指定します。例えば、score20未満のドキュメントを除外するフィルターの場合、次のフィルタークエリを使用できます。

{ "score": { "$gt": 20 } }
フィルター クエリ入力スクリーンショット
5

Projection入力ボックス内に、フィルターが適用されたときに受信クエリにマージするプロジェクションドキュメントを含むドキュメントを指定します。

例えば、career_stats フィールドと personal フィールドをドキュメントから除外するフィルターでは、次のフィルタープロジェクションを使用できます。

{
"career_stats": 0,
"personal": 0
}
フィルター投影入力スクリーンショット
6

フィルタを設定したら、Save Draftをクリックします。保存後、App Services によってすぐに評価が開始され、コレクションの受信クエリにフィルターが適用されます。

1

appservices を使用してコレクションのフィルターを定義するには、アプリケーションの構成ファイルのローカル コピーが必要です。

アプリの最新バージョンのローカルコピーを取得するには、次のコマンドを実行します。

appservices pull --remote="<Your App ID>"

Tip

App Services UI のDeploy > Export App画面からアプリケーションの構成ファイルのコピーをダウンロードすることもできます。

2

コレクションのロールを定義または変更するには、コレクションの設定ディレクトリ内の 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の作成に焦点を当てています。ロールと権限を定義しスキーマを強制する方法については、他の構成ガイドを参照してください。

注意

フェデレーティッド データソースは、ルールまたは スキーマ をサポートしていません。 フェデレーティッド データソースには、システム関数からのみアクセスできます。

3

設定するフィルターごとに、 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 ドキュメント展開を使用することはできません。ただし、 %%user%%values%functionなどの他の展開を使用することはできます。

query
object
Default: {}

App Services がフィルタリングされた操作の既存のクエリにマージするMongoDB クエリ

フィルターは、次のクエリを使用して、score20 より低いドキュメントを除外します。

{ "score": { "$gte": 20 } }
projection
object
Default: {}

App Services がフィルタリングされた操作の既存のプロジェクションに統合するMongoDB プロジェクション

重要

プロジェクションの競合

MongoDB プロジェクションには包括的と排他的のいずれかのプロジェクションががあります。つまり、指定されたフィールドのみを返すか、指定されていないフィールドを除外することができます。 クエリに複数のフィルターを適用する場合、フィルターはすべて同じプロジェクション タイプを指定する必要があります。そうしないと、クエリは失敗します。

フィルターは、次のプロジェクションを使用するすべてのドキュメントから_internalフィールドを除外します。

{ "_internal": 0 }
4

rules.jsonを定義して保存したら、更新された構成をリモート アプリにプッシュできます。App Services CLI はプッシュ時にフィルターをすぐに配置します。

appservices push --remote="<Your App ID>"

注意

App Services フィルターのセキュリティに関する考慮事項

ロールベースの権限とフィルターで、コレクション内の特定のドキュメントとフィールドを隠すことができますが、システムが任意のクエリによるコレクションへのアクセスを許可している場合、データが意図せず表示される可能性があります。

たとえば、コレクションに格納されている値に応じてエラー(ゼロ除算エラーなど)を発生させるクエリまたは関数は、ロールまたはフィルターによる制限でクエリ元のユーザーがドキュメントを直接表示できない場合でも、ドキュメントに関する情報を表示することがあります。ユーザーは、他の方法(データの分布に影響を受ける可能性のあるクエリの実行時間を測定するなど)で基礎となるデータについて推論することもできます。

この可能性を認識し、必要に応じてデータアクセス パターンを監査してください。

戻る

ルール式