수신 쿼리 필터링
이 페이지의 내용
개요
필터는 수신 MongoDB 쿼리를 수정하여 쿼리와 일치하는 결과의 하위 집합만 반환하도록 합니다. 컬렉션에 필터를 추가하면 쿼리된 문서의 형태를 제어하고 쿼리 성능을 향상시킬 수 있습니다.
필터는 Atlas App Services가 쿼리를 실행하기 전에 다른 쿼리 매개변수를 추가하고 쿼리 결과에서 필드를 생략합니다. 모든 필터에는 다음과 같은 세 가지 구성 요소가 있습니다.
필터가 들어오는 요청에 적용되는지 여부를 결정하는 "apply when" 표현식입니다. "apply when" 표현식에서는
%%user
,%%request
등의 변수를 사용할 수 있습니다. 하지만 App Services에서 문서를 읽기 전에 "apply when" 표현식을 평가하기 때문에%%root
처럼 문서를 참조하는 확장은 사용할 수 없습니다.필터가 적용되는 요청의 기존 쿼리와 병합되는 선택적 쿼리 표현식입니다.
선택적 프로젝션 문서로, 표준 MongoDB 프로젝션 구문을 사용하고 필터가 적용되는 모든 요청의 기존 프로젝션과 병합합니다.
App Services에서 필터를 적용하는 방법
App Services는 규칙이 적용되는 모든 MongoDB 요청에 대해 필터를 평가하고 적용합니다(Device Sync 요청은 제외). 필터링 가능한 MongoDB 요청의 예시는 다음과 같습니다.
컬렉션의 쿼리
문서에 쓰기
필터는 특정 요청의 컨텍스트에 따라 해당 필터의 "apply when" 표현식이 참으로 평가될 경우 해당 요청에 적용됩니다. 필터가 요청에 적용될 경우, App Services는 해당 필터의 쿼리 또는 프로젝션을 요청된 연산의 기존 쿼리 및 프로젝션에 병합합니다.
하나의 요청에 여러 필터가 적용될 수 있습니다.
App Services는 요청을 MongoDB로 보내기 전에 요청에 필터를 적용합니다.
예시
하나의 컬렉션에는 수백만 개의 문서가 포함되어 있고 다음과 같은 "apply when" 표현식을 사용하는 역할 하나를 가지고 있습니다.
{ "owner_id": "%%user.id" }
필터가 적용되지 않은 경우 App Services는 쿼리와 일치하는 각 문서의 역할을 평가합니다. App Services에서 owner_id
필드의 값으로 사용자 ID가 없는 문서를 보류한다는 것을 알고 있습니다. 따라서 App Services에서 역할을 평가하기 전에 이러한 문서를 제외하는 추가 쿼리 술어를 적용하여 시간과 컴퓨팅 리소스를 절약합니다.
적용 조건 | 쿼리 | 프로젝션 |
---|---|---|
{ "%%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는 문서를 읽기 전에 필터를 평가하고 적용하므로 필터의 적용 시기 표현식에서 MongoDB 문서 확장을 사용할 수 없습니다. 그러나 %%user
, %%values
및 %function
와(과) 같은 다른 확장을 사용할 수 있습니다.
필터 프로젝션 지정하기
Projection 입력 상자에서 필터하다 가 적용될 때 수신 쿼리 에 병합할 프로젝션 문서 가 포함된 문서 를 지정합니다.
예를 들어 문서에서 career_stats
, personal
필드를 제외하는 필터는 다음과 같은 필터 프로젝션을 사용할 수 있습니다.
{ "career_stats": 0, "personal": 0 }
규칙 구성 파일 추가
컬렉션 의 역할을 정의하거나 수정하려면 컬렉션의 구성 디렉토리 에서 rules.json
구성 파일 을 엽니다.
팁
컬렉션 스캐폴드
컬렉션 에 대한 규칙이나 스키마 를 아직 정의하지 않은 경우 구성 디렉토리 와 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
를 만드는 데 중점을 둡니다. 역할 및 권한을 정의하고 스키마를 시행하다하는 방법을 학습 보려면 다른 구성 가이드를 확인하세요.
참고
연합 데이터 소스는 규칙이나 스키마를 지원하지 않습니다. 연합 데이터 소스에는 시스템 기능에서만 액세스할 수 있습니다.
하나 이상의 필터 추가
구성하려는 각 필터하다 에 대해 filters
배열 에 문서 를 추가합니다. 필터 문서의 형식은 다음과 같습니다.
{ "name": "<Filter Name>", "apply_when": { Expression }, "query": { MongoDB Query }, "projection": { MongoDB Projection } }
필드 | 설명 | |
---|---|---|
name string | 필수입니다. 필터의 이름입니다. 필터 이름은 필터를 식별하고 구분하는 데 유용합니다. 100자 이하로 제한됩니다. | |
apply_when object | 이 필터가 수신 MongoDB 작업에 적용되는 시기를 결정하는 표현식 입니다. 중요Atlas App Services는 문서를 읽기 전에 필터를 평가하고 적용하므로 필터의 적용 시기 표현식에서 MongoDB 문서 확장을 사용할 수 없습니다. 그러나 | |
query object Default: {} | Atlas App Services가 필터링된 작업의 기존 쿼리에 병합하는 MongoDB 쿼리 입니다. 예시필터는 다음 쿼리를 사용하여 미만의 가 있는 문서를 보류합니다.
| |
projection object Default: {} | Atlas App Services가 필터링된 작업의 기존 프로젝션에 병합하는 MongoDB 프로젝션 입니다. 중요프로젝션 충돌MongoDB 프로젝션은 포괄적 또는 배타적일 수 있습니다. 즉, 지정된 필드만 반환하거나 지정되지 않은 필드를 보류할 수 있습니다. 쿼리에 여러 필터가 적용되는 경우 필터가 모두 동일한 유형의 프로젝션을 지정해야 하며, 그렇지 않으면 쿼리가 실패합니다. 예시필터는 다음 프로젝션을 사용하여 모든 문서에서
|
참고
App Services 필터의 보안 고려 사항
역할 기반 권한 및 필터는 컬렉션 내의 특정 문서와 필드를 숨길 수 있지만, 시스템에서 임의의 쿼리가 컬렉션에 액세스할 수 있도록 허용하는 경우 데이터가 노출될 가능성이 있습니다.
예를 들어, 컬렉션에 저장된 값에 따라 오류를 발생시키는 쿼리 또는 함수(예: 0으로 나누기 오류)는 역할이나 필터로 인해 쿼리하는 사용자가 문서를 직접 볼 수 없는 경우에도 문서에 대한 정보를 표시할 수 있습니다. 사용자는 다른 방법(예: 데이터 분산의 영향을 받을 수 있는 쿼리 실행 시간 측정)으로 기본 데이터에 대해 추론할 수도 있습니다.
이러한 사항이 가능하다는 것을 인지하시고 필요한 경우 데이터 액세스 패턴을 감사하세요.