Docs Menu
Docs Home
/ /
Atlas App Services
/

수신 쿼리 필터링

이 페이지의 내용

  • 개요
  • App Services에서 필터를 적용하는 방법
  • 필터 정의
  • 절차

필터는 수신 MongoDB 쿼리를 수정하여 쿼리와 일치하는 결과의 하위 집합만 반환하도록 합니다. 컬렉션에 필터를 추가하면 쿼리된 문서의 형태를 제어하고 쿼리 성능을 향상시킬 수 있습니다.

필터는 Atlas 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 데이터 소스가 필요합니다.

1

왼쪽 탐색 메뉴의 Data Access 에서 Rules 를 클릭합니다.

2

Rules 메뉴에서 필터를 구성하려는 컬렉션을 선택한 다음 Filters 탭을 클릭합니다. Add a Filter를 클릭하고 새 필터에 Filter Name을 입력합니다.

3

Apply When 입력 상자에 필터가 쿼리에 적용되는 시기를 정의하는 규칙 표현식을 입력합니다. 들어오는 쿼리에 대해 표현식이 true으로 평가되는 경우, App Services는 들어오는 쿼리에 Filter Query 매개변수를 추가합니다.

필터 입력 시 적용 스크린샷

중요

Atlas App Services는 문서를 읽기 전에 필터를 평가하고 적용하므로 필터의 적용 시기 표현식에서 MongoDB 문서 확장을 사용할 수 없습니다. 그러나 %%user, %%values%function와(과) 같은 다른 확장을 사용할 수 있습니다.

4

Query 입력 상자에서 필터 적용 시 들어오는 쿼리에 병합할 추가 쿼리 조건자가 포함된 문서를 지정합니다. 예를 들어 score 미만의 문서를 원천징수하는 필터는 다음 필터 쿼리를 사용할 수 있습니다. 20

{ "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>"

Realm UI의 Deploy > Export App 화면에서 애플리케이션의 구성 파일 사본을 다운로드할 수도 있습니다.

2

컬렉션 의 역할을 정의하거나 수정하려면 컬렉션의 구성 디렉토리 에서 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 를 만드는 데 중점을 둡니다. 역할 및 권한을 정의하고 스키마를 시행하다하는 방법을 학습 보려면 다른 구성 가이드를 확인하세요.

참고

연합 데이터 소스는 규칙이나 스키마를 지원하지 않습니다. 연합 데이터 소스에는 시스템 기능에서만 액세스할 수 있습니다.

3

구성하려는 각 필터하다 에 대해 filters 배열 에 문서 를 추가합니다. 필터 문서의 형식은 다음과 같습니다.

{
"name": "<Filter Name>",
"apply_when": { Expression },
"query": { MongoDB Query },
"projection": { MongoDB Projection }
}
필드
설명
name
string
필수입니다. 필터의 이름입니다. 필터 이름은 필터를 식별하고 구분하는 데 유용합니다. 100자 이하로 제한됩니다.
apply_when
object

이 필터가 수신 MongoDB 작업에 적용되는 시기를 결정하는 표현식 입니다.

중요

Atlas App Services는 문서를 읽기 전에 필터를 평가하고 적용하므로 필터의 적용 시기 표현식에서 MongoDB 문서 확장을 사용할 수 없습니다. 그러나 %%user, %%values%function와(과) 같은 다른 확장을 사용할 수 있습니다.

query
object
Default: {}

Atlas App Services가 필터링된 작업의 기존 쿼리에 병합하는 MongoDB 쿼리 입니다.

예시

필터는 다음 쿼리를 사용하여 미만의 가 있는 문서를 보류합니다.score 20

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

Atlas App Services가 필터링된 작업의 기존 프로젝션에 병합하는 MongoDB 프로젝션 입니다.

중요

프로젝션 충돌

MongoDB 프로젝션은 포괄적 또는 배타적일 수 있습니다. 즉, 지정된 필드만 반환하거나 지정되지 않은 필드를 보류할 수 있습니다. 쿼리에 여러 필터가 적용되는 경우 필터가 모두 동일한 유형의 프로젝션을 지정해야 하며, 그렇지 않으면 쿼리가 실패합니다.

예시

필터는 다음 프로젝션을 사용하여 모든 문서에서 _internal 필드를 보류합니다.

{ "_internal": 0 }
4

rules.json 를 정의하고 저장한 후에는 업데이트된 구성을 원격 앱 에 푸시할 수 있습니다. App Services CLI 는 푸시 시 필터를 즉시 배포합니다.

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

참고

App Services 필터의 보안 고려 사항

역할 기반 권한 및 필터는 컬렉션 내의 특정 문서와 필드를 숨길 수 있지만, 시스템에서 임의의 쿼리가 컬렉션에 액세스할 수 있도록 허용하는 경우 데이터가 노출될 가능성이 있습니다.

예를 들어, 컬렉션에 저장된 값에 따라 오류를 발생시키는 쿼리 또는 함수(예: 0으로 나누기 오류)는 역할이나 필터로 인해 쿼리하는 사용자가 문서를 직접 볼 수 없는 경우에도 문서에 대한 정보를 표시할 수 있습니다. 사용자는 다른 방법(예: 데이터 분산의 영향을 받을 수 있는 쿼리 실행 시간 측정)으로 기본 데이터에 대해 추론할 수도 있습니다.

이러한 사항이 가능하다는 것을 인지하시고 필요한 경우 데이터 액세스 패턴을 감사하세요.

돌아가기

규칙 표현식