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 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