Cloud Firestore, tek bir sorguda birden çok alanda aralık ve eşitsizlik filtrelerinin kullanılmasını destekler. Birden çok alanda aralık ve eşitsizlik koşulları belirleyebilir ve uygulama geliştirme sürecini, filtreleme sonrası mantığın uygulama yetkisini Cloud Firestore'a gidin.
Birden çok alanda aralık ve eşitsizlik filtreleri
Aşağıdaki sorgu, tüm sonuçları döndürmek için popülasyon ve yoğunluk ile ilgili aralık filtrelerini kullanır. nüfusunun 1.000.000'dan fazla olduğu ve nüfus yoğunluğunun yüksek olduğu şehirler 10.000’den az insan olduğunu düşünelim.
Web sürümü 9 modüler
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)
Java
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);
Dizine eklemeyle ilgili dikkat edilmesi gereken noktalar
Sorgularınızı çalıştırmadan önce sorgular ve Cloud Firestore veri modeli hakkında daha fazla bilgi edinin.
Cloud Firestore'da sorgunun ORDER BY
ifadesi hangi dizinleri belirler
sorgu sunmak için kullanılabilir. ��rneğin, ORDER BY a ASC, b ASC
sorgusu
a ASC, b ASC
alanlarında bir bileşik dizin gerektirir.
Cloud Firestore sorgularının performansını ve maliyetini optimize etmek için dizindeki alanların sırasını optimize eder. Bunun için, dizininizin elde edilen tüm verileri soldan sağa doğru sıralayacaktır; böylece sorgu gereksiz dizin girişlerinin taranmasını önler.
Bir çalışan koleksiyonunda arama yapmak ve Amerika Birleşik Devletleri'ni bulmak istediğinizi
maaşı 100.000 ABD dolarından fazla olan ve yıllık deneyim sayısı 100.000 doların üzerinde olan çalışanların
0'dan büyüktür. Veri kümesi hakkındaki bilgilerinizi temel alarak, veri kümesi
maaş kısıtlaması, deneyim kısıtlamasına göre daha seçicidir. İdeal
tarama sayısını azaltacak bir indeks,
(salary [...], experience [...])
Böylece, hızlı ve etkili bir şekilde
uygun maliyetli olduğu için experience
tarihinden önce salary
sipariş eder ve aşağıdaki gibi görünür:
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");
Dizinleri optimize etmek için en iyi uygulamalar
Dizinleri optimize ederken aşağıdaki en iyi uygulamalara dikkat edin.
Dizin alanlarını eşitliklere ve ardından en seçici aralık veya eşitsizlik alanına göre sıralayın
Cloud Firestore, aşağıdaki koşulları karşılamak için bileşik dizinin en soldaki alanlarını kullanır:
ilk alanda eşitlik kısıtlamaları ve varsa aralık veya eşitsizlik kısıtlaması
orderBy()
sorgusu. Bu kısıtlamalar dizin sayısını azaltabilir
girişlerine izin verir. Cloud Firestore, kalan alanları kullanır
kapsamının daraltılmasına neden olabilir. Bu
Kısıtlamalar, Cloud Firestore'un taradığı dizin girişi sayısını azaltmaz
ancak eşleşmeyen belgeleri filtreleyerek, eşleşen belgelerin sayısını
ve müşterilere iade edilecek görevler de azaltılmış olur.
Verimli dizinler oluşturma hakkında daha fazla bilgi için dizin özellikleri konusuna bakın.
Alanları sorgu kısıtlaması seçiciliğine göre azalan sırada sırala
Cloud Firestore'un sorgunuz için en uygun dizini seçtiğinden emin olmak amacıyla
alanları sorguya göre azalan düzende sıralayan bir orderBy()
ifadesi belirtin
kısıt seçimliliği. Daha yüksek seçicilik, daha küçük bir
daha düşük seçicilik ise daha büyük bir doküman alt kümesiyle eşleşmektedir. Lütfen
daha önce dizinde daha yüksek seçiciliğe sahip aralık veya eşitsizlik alanlarını seçersiniz
alanlara göre daha az sıralama vardır.
Cloud Firestore'un taradığı ve döndürdüğü doküman sayısını en aza indirmek için her zaman azalan sorguya göre sıralamanız gerekir. kısıt seçimliliği. Sonuç kümesi gerekli sırada değilse ve küçük olması bekleniyorsa, sonucun küçük olması için sipariş beklentinize göre yeniden sıralayın.
Örneğin, bir çalışan koleksiyonunda arama yapmak istediğinizi Maaşları 100.000 doların üzerinde olan Amerika Birleşik Devletleri çalışanları ve sonuçları deneyim sunmalısınız. Yalnızca az sayıda çalışanın maaşı olacağını tahmin ediyorsanız değeri 100.000 ABD dolarının üzerindeyse sorguyu yazmanın en etkili yolu şudur:
Java
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`
Sorguya experience
üzerinden bir sipariş eklendiğinde aynı grup elde edilir
ve istemcilerde sonuçların yeniden sıralanmasını önlemek için sorgu,
önceki sorguya göre çok daha fazla gereksiz dizin girişi okumasını sağlar. Çünkü
Cloud Firestore her zaman dizin alanları öneki ile
ifade eder. experience
maddeye göre siparişe eklendiyse
Cloud Firestore, (experience [...], salary [...])
dizinini seçer
için de kullanılabilir. Paydaşlarla ilgili başka hiçbir kısıtlama olmadığından,
experience
için Cloud Firestore, aşağıdaki bağlantıdaki tüm dizin girişlerini okur:
Nihai öğeyi bulmak için salary
filtresini uygulamadan önce employees
koleksiyonu
yardımcı olur. Bu, salary
parametresini karşılamayan dizin girişlerinin
filtrelenmeye devam eder. Bu da sorgunun gecikmesini ve maliyetini artırır.
Fiyatlandırma
Birden fazla alanda aralık ve eşitsizlik filtrelerine sahip sorgular şu ölçüte göre faturalandırılır: okuması ve dizine eklemesi için kullanır.
Ayrıntılı bilgi için Fiyatlandırma sayfasına göz atın.
Sınırlamalar
Sorgu sınırlamaları dışında, abonelikten önce Birden çok alanda aralık ve eşitsizlik filtreleri içeren sorgular kullanarak:
- Belge alanlarında aralık veya eşitsizlik filtreleri ve yalnızca eşitlik içeren sorgular
(__name__)
doküman anahtarındaki kısıtlamalar desteklenmiyor. - Cloud Firestore, aralık veya eşitsizlik alanlarının sayısını 10 ile sınırlandırır. Bunun amacı, sorguların çok pahalı olmasını önlemektir gerekir.
Sırada ne var?
- Sorgularınızı optimize etme hakkında bilgi edinin.
- Basit ve birleşik sorgular gerçekleştirme hakkında daha fazla bilgi edinin.
- Cloud Firestore'un dizinleri nasıl kullandığını öğrenin.