Cloud Firestore, tek bir sorguda birden çok alanda aralık ve eşitsizlik filtrelerinin kullanılmasını destekler. Artık birden fazla alanda aralık ve eşitsizlik koşullarına sahip olabilir ve filtreleme sonrası mantığın uygulanmasına Cloud Firestore'a yetki vererek uygulama geliştirme sürecinizi basitleştirebilirsiniz.
Birden çok alanda aralık ve eşitsizlik filtreleri
Aşağıdaki sorgu, yaş ve boy oranına göre aralık filtrelerini kullanarak yaşı 35'ten büyük, boyu ise 60 ile 70 arasında olan tüm kullanıcıları döndürür.
Web sürümü 9 modüler
const q = query(
collection(db, "users"),
where('age', '>', 35),
where('height', '>', 60),
where('height', '<', 70)
);
Swift
let query = db.collection("users")
.whereField("age", isGreaterThan: 35)
.whereField("height", isGreaterThan: 60)
.whereField("height", isLessThan: 70)
Objective-C
FIRQuery *query =
[[[[self.db collectionWithPath:@"users"]
queryWhereField:@"age" isGreaterThan:@35]
queryWhereField:@"height" isGreaterThan:@60]
queryWhereField:@"height" isLessThan:@70];
Java Android
Query query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Kotlin+KTX Android
val query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70)
Java
db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Node.js
db.collection("users")
.where('age', '>', 35),
.where('height', '>', 60),
.where('height', '<', 70)
Dizine eklemeyle ilgili dikkat edilmesi gereken noktalar
Sorgularınızı çalıştırmaya başlamadan önce sorgular ve Cloud Firestore veri modeli hakkında bilgi edinin.
Cloud Firestore'da, sorgunun ORDER BY
ifadesi, sorguyu sunmak için hangi dizinlerin kullanılabileceğini belirler. Örneğin, bir 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 etmeniz gerekir. Bunu yapmak için dizininizin soldan sağa doğru sıralandığından emin olmalısınız. Böylece sorgu, fazla dizin girişlerinin taranmasını önleyen bir veri kümesine sokulur.
Bir çalışan koleksiyonunda arama yapmak istediğinizi ve maaşı 100.000'den fazla, yıllık deneyim sayısı 0'dan fazla olan çalışanları bulmak istediğinizi varsayalım. Veri kümesi konusundaki bilginizle, maaş kısıtının deneyim kısıtlamasına göre daha seçici olduğunu biliyorsunuz. Dizin taramalarının sayısını azaltacak ideal dizin (salary [...], experience [...])
olur. Bu nedenle, hızlı ve uygun maliyetli olan sorgu experience
öncesinde salary
sıralanır 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, orderBy()
sorgusunun ilk alanında eşitlik kısıtlamalarını ve aralık ya da eşitsizlik kısıtlamasını (varsa) karşılamak için bileşik dizinin en soldaki alanlarını kullanır. Bu kısıtlamalar, Cloud Firestore'un taradığı dizin girişlerinin sayısını azaltabilir. Cloud Firestore, sorgunun diğer aralık veya eşitsizlik kısıtlamalarını karşılamak için dizinin kalan alanlarını kullanır. Bu kısıtlamalar, Cloud Firestore'un taradığı dizin girişi sayısını azaltmaz ancak eşleşmeyen belgeleri filtreleyerek müşterilere döndürülen belgelerin sayısını azaltır.
Verimli dizinler oluşturma hakkında daha fazla bilgi için mükemmel dizinin tanımına 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ı sorgu kısıtlamalı seçiciliğe göre azalan düzende sıralayan bir orderBy()
ifadesi belirtin. Yüksek seçicilik daha küçük bir doküman alt kümesiyle eşleşirken düşük seçicilik daha büyük bir doküman alt kümesiyle eşleşir. Dizin sırasında, seçiciliği daha düşük olan alanlara kıyasla daha yüksek seçiciliğe sahip aralık veya eşitsizlik alanlarını seçtiğinizden emin olun.
Cloud Firestore'un ağ üzerinden tarayıp döndürdüğü doküman sayısını en aza indirmek için alanları daima sorgu kısıtlamalı seçiciliğe göre azalan düzende sıralamanız gerekir. Sonuç kümesi gerekli sırada değilse ve sonuç kümesinin küçük olması bekleniyorsa bunları sipariş beklentinize göre yeniden sıralamak için istemci tarafı mantığı uygulayabilirsiniz.
Örneğin, maaşları 100.000'in üzerinde olan çalışanları bulmak için bir çalışan koleksiyonunda arama yapmak ve sonuçları çalışanın deneyim yılına göre sıralamak istediğinizi varsayalım. Yalnızca az sayıda çalışanın maaşının 100.000'den fazla olmasını bekliyorsanız sorguyu yazmanın en etkili yolu aşağıdaki gibidir:
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
işlevinde bir sıralama eklendiğinde aynı belge grubu elde edilecek ve istemcilerde sonuçların yeniden sıralanması engellenecek olsa da sorgu, önceki sorguya göre çok daha fazla harici dizin girişi okuyabilir. Bunun nedeni, Cloud Firestore'un her zaman dizin alanları ön eki sorgunun sıralama ölçütüyle eşleşen bir dizini tercih etmesidir. experience
, ifadeye göre sıralamaya eklenmişse Cloud Firestore, sorgu sonuçlarını hesaplamak için (experience [...], salary [...])
dizinini seçer. experience
üzerinde başka kısıtlama olmadığından Cloud Firestore, nihai sonuç grubunu bulmak için salary
filtresini uygulamadan önce employees
koleksiyonunun tüm dizin girişlerini okur. Bu, salary
filtresini karşılamayan dizin girişlerinin okunmaya devam ettiği anlamına gelir. Bu da sorgunun gecikmesi ve maliyetini artırır.
Fiyatlandırma
Birden fazla alanda aralık ve eşitsizlik filtresine sahip sorgular, okunan belgelere ve dizin girişlerine göre faturalandırılır.
Ayrıntılı bilgi için Fiyatlandırma sayfasına göz atın.
Sınırlamalar
Sorgu sınırlamaları dışında, birden fazla alanda aralık ve eşitsizlik filtreleriyle sorgu kullanmadan önce aşağıdaki sınırlamaları göz önünde bulundurun:
- Belge alanlarında aralık veya eşitsizlik filtreleri olan sorgular ve yalnızca
(__name__)
belge anahtarında eşitlik kısıtlamaları olan sorgular desteklenmez. - Cloud Firestore, aralık veya eşitsizlik alanlarının sayısını 10 ile sınırlandırır. Bunun amacı, sorguların çalıştırılmasının çok pahalı olmasını önlemektir.
Sonraki Adımlar
- 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.