Cloud Firestore를 사용하면 단일 쿼리에서 여러 필드에 범위 및 부등식 필터를 사용할 수 있습니다. 여러 필드에 범위 및 부등식 조건을 설정하여 애플리케이션 개발을 위해 사후 필터링 로직의 구현을 Cloud Firestore
여러 필드의 범위 및 불일치 필터
다음 쿼리는 인구 및 밀도에 범위 필터를 사용하여 모든 인구가 100만 명 이상이고 인구 밀도가 높은 도시 10,000명 미만입니다.
웹 버전 9 모듈식
const q = query(
collection(db, "cities"),
where('population', '>', 1000000),
where('density', '<', 10000),
);
Swift
let query = db.collection("cities")
.whereField("population", isGreaterThan: 1000000)
.whereField("density", isLessThan: 10000)
Objective-C
FIRQuery *query =
[[[[self.db collectionWithPath:@"cities"]
queryWhereField:@"population" isGreaterThan:@1000000]
queryWhereField:@"density" isLessThan:@10000];
Java Android
Query query = db.collection("cities")
.whereGreaterThan("population", 1000000)
.whereLessThan("density", 10000);
Kotlin+KTX Android
val query = db.collection("cities")
.whereGreaterThan("population", 1000000)
.whereLessThan("density", 10000)
Go
query := client.Collection("cities").
Where("population", ">", 1000000).
Where("density", "<", 10000)
자바
db.collection("cities")
.whereGreaterThan("population", 1000000)
.whereLessThan("density", 10000);
Node.js
db.collection("cities")
.where('population', '>', 1000000),
.where('density', '<', 10000)
Python
from google.cloud import firestore
db = firestore.Client()
query = db.collection("cities")
.where("population", ">", 1000000)
.where("density", "<", 10000)
PHP
C#
Ruby
query = cities_ref.where("population", ">", "1000000")
.where("density", "<", 10000)
C++
CollectionReference cities_ref = db->Collection("cities");
Query query = cities_ref.WhereGreaterThan("population", FieldValue::Integer(1000000))
.WhereLessThan("density", FieldValue::Integer(10000));
Unity
CollectionReference citiesRef = db.Collection("cities");
Query query = citiesRef.WhereGreaterThan("population", 1000000)
.WhereLessThan("density", 10000);
Dart
final citiesRef = FirebaseFirestore.instance.collection('cities')
final query = citiesRef.where("population", isGreaterThan: 1000000)
.where("density", isLessThan: 10000);
색인 생성 고려사항
쿼리를 실행하기 전에 쿼리 및 Cloud Firestore 데이터 모델에 대해 알아봅니다.
Cloud Firestore에서는 쿼리의 ORDER BY
절에 따라
쿼리 서빙에 사용할 수 있습니다 예를 들어 ORDER BY a ASC, b ASC
쿼리
에는 a ASC, b ASC
필드에 대한 복합 색인이 필요합니다.
Cloud Firestore 쿼리의 성능과 비용을 최적화하려면 다음 안내를 따르세요. 색인의 필드 순서를 최적화합니다. 이렇게 하려면 색인이 쿼리가 올바른 데이터 세트로 추출되도록 불필요한 색인 항목의 스캔을 방지합니다.
직원 컬렉션을 검색하고 미국을 찾고 싶다고 가정해 보겠습니다.
급여가 $100,000를 초과하고 경력 연수가
0보다 큰 값으로 지정됩니다. 데이터 세트에 대한 이해를 바탕으로 급여 제약조건이 경력 제약조건보다 더 선택적이라는 것을 알 수 있습니다. 색인 스캔 횟수를 줄일 수 있는 이상적인 색인은 (salary [...], experience [...])
입니다. 따라서 빠르고 비용 효율적인 쿼리는 experience
보다 salary
를 먼저 정렬하며 다음과 같이 표시됩니다.
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
Node.js
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.orderBy("salary")
.orderBy("experience");
Python
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.order_by("salary")
.order_by("experience");
색인 최적화를 위한 권장사항
색인을 최적화하는 경우 다음 권장사항을 따르세요.
가장 선택적인 범위 또는 불일치 필드가 이어서 오는 일치 여부를 기준으로 색인 필드 순서 지정
Cloud Firestore는 복합 색인의 가장 왼쪽 필드를 사용하여
첫 번째 필드의 균등 제약 조건 및 범위 또는 부등식 제약 조건(있는 경우)
(orderBy()
쿼리) 이러한 제약 조건을 사용하면
색인 수를 줄일 수 있으며
Cloud Firestore에서 스캔하는 항목을 찾습니다. Cloud Firestore는 나머지 필드를 사용합니다.
쿼리의 다른 범위 또는 부등식 제약 조건을 충족합니다. 이러한
제약조건으로 Cloud Firestore가 스캔하는 색인 항목 수가 줄어들지 않습니다.
일치하지 않는 문서를 필터링하여 제외할 수 있습니다.
감소하는 것을 볼 수 있습니다
효율적인 색인 만들기에 대한 자세한 내용은 색인 속성을 참조하세요.
쿼리 제약조건 선택성의 내림차순으로 필드 순서 지정
Cloud Firestore가 쿼리에 가장 적합한 색인을 선택하도록 하려면 다음 안내를 따르세요.
필드를 쿼리의 내림차순으로 정렬하는 orderBy()
절 지정
제약 조건 선택성 선택성이 높을수록 작은 문서의 하위 집합과 일치하고 선택성이 낮을수록 큰 문서의 하위 집합과 일치합니다. 색인 순서에서 선택성이 낮은 필드보다 선택성이 높은 범위 또는 불일치 필드를 먼저 선택해야 합니다.
Cloud Firestore이(가) 스캔하고 반환하는 문서 수를 최소화하기 위해 네트워크를 구성하는 경우 항상 필드를 쿼리의 내림차순으로 정렬해야 합니다. 제약 조건 선택성 결과 집합이 필요한 순서가 아니며 결과 집합이 작을 것으로 예상되는 경우 클라이언트 측 로직을 구현하여 예상되는 순서에 따라 순서를 다시 지정할 수 있습니다.
예를 들어 직원 컬렉션을 검색하여 급여가 $100,000 이상인 미국 직원을 대상으로 도움이 됩니다. 소수의 직원만 급여를 받을 것으로 예상되는 경우 100,000달러를 초과하는 경우 쿼리를 작성하는 가장 효율적인 방법은 다음과 같습니다.
자바
db.collection("employees")
.whereGreaterThan("salary", 100000)
.orderBy("salary")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
// Order results by `experience`
}
});;
Node.js
const querySnapshot = await db.collection('employees')
.where("salary", ">", 100000)
.orderBy("salary")
.get();
// Order results by `experience`
Python
results = db.collection("employees")
.where("salary", ">", 100000)
.order_by("salary")
.stream()
// Order results by `experience`
쿼리에 experience
의 순서를 추가하면 동일한 문서 집합이 생성되고 클라이언트에서 결과가 다시 정렬되지 않지만 쿼리가 관련 없는 색인 항목을 이전 쿼리보다 더 많이 읽을 수 있습니다. 이는
Cloud Firestore는 색인 필드 접두사가
정렬해야 합니다. experience
가 order by 절에 추가된 경우
그러면 Cloud Firestore는 (experience [...], salary [...])
색인을 선택합니다.
쿼리 결과를 계산할 수 있습니다 다른 제약조건이 없기 때문에
experience
, Cloud Firestore는 다음 항목의 모든 색인 항목을 읽습니다.
salary
필터를 적용하여 최종 값을 찾기 전에 employees
컬렉션
결과 집합을 정의합니다. 즉, salary
를 충족하지 않는 색인 항목은
필터가 계속 읽히기 때문에 쿼리의 지연 시간과 비용이 증가합니다.
가격 책정
여러 필드에 범위 및 불일치 필터가 있는 쿼리에는 문서 읽기 및 색인 항목 읽기를 기준으로 요금이 청구됩니다.
자세한 내용은 가격 책정 페이지를 참조하세요.
제한사항
쿼리 제한사항 외에도 여러 필드에 범위 및 불일치 필터가 있는 쿼리를 사용하기 전에 다음 제한사항에 유의하세요.
- 문서 필드에 범위 또는 비균등 필터가 있고 균등만 있는 쿼리
문서 키
(__name__)
에 대한 제약 조건은 지원되지 않습니다. - Cloud Firestore는 범위 또는 부등식 필드의 수를 10으로 제한합니다. 이는 쿼리 실행 비용이 너무 많이 드는 것을 방지하기 위한 것입니다.
다음 단계
- 쿼리 최적화에 대해 자세히 알아보기
- 단순 쿼리 및 복합 쿼리 실행에 대해 자세히 알아보기
- Cloud Firestore에서 색인을 사용하는 방법을 이해합니다.