Birden çok alanda aralık ve eşitsizlik filtreleriyle sorguya genel bakış

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