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
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 ürününde, 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 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 bilginize dayanarak,
maaş kısıtlaması, deneyim kısıtlamasına göre daha seçicidir. İdeal
tarama sayısını azaltacak bir indeks,
(salary [...], experience [...])
Bu nedenle, hızlı ve kolay
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,
ilk alanda eşitlik kısıtlamaları ve varsa aralık veya eşitsizlik kısıtlaması
(orderBy()
sorgusunda) Bu kısıtlamalar dizin sayısını azaltabilir
Cloud Firestore tarafından taranır. Cloud Firestore kalan alanları kullanır
kapsamının daraltılmasına neden olabilir. Bu
kısıtlamalar, Cloud Firestore ürününün 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 öğesinin 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 tarafından taranan ve iade edilen 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 dizin girişi okumasına yardımcı olur. Çünkü
Cloud Firestore her zaman dizin alanları öneki
ifade eder. experience
maddeye göre siparişe eklendiyse
ardından 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
, Cloud Firestore aşağıdaki dizinlerin tüm dizin girişlerini okur
Nihai dosyayı 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 uygulamasının dizinleri nasıl kullandığını öğrenin.