Cloud Firestore, tek bir sorguda birden çok alanda aralık ve eşitsizlik filtrelerinin kullanılmasını destekler. Artık koşullardaki eşitsizliği gidermenize yardımcı olabilir 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, yaşı şu olan tüm kullanıcıları döndürür: büyüklük 35'ten büyük ve boy 60 ile 70 arasındadı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 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 soldan sağa doğru sıralandığından emin olmalısınız. Böylece sorgu, filtrelenerek tarama yapılmasını önleyen bir veri kümesine gereksiz dizin girişleri olabilir.
Bir çalışan koleksiyonunda arama yapmak istediğinizi varsayalım.
Maaşları 100.000'in üzerinde olan ve yıllık deneyim sayısı 100.000'in ü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, web sitenizin
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 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ı 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 yaparak çalışanların maaşları 100.000’in üzerinde olan kişilerin sonuçları ise deneyim sunmalısınız. Yalnızca az sayıda çalışanın maaş alacağını tahmin ediyorsanız değer 100.000'den fazlaysa sorguyu yazmanın en verimli 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 dizin girişi okumasına yardımcı olur. Çü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
sorgu sonuçlarını kullanır. 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.
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.