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

Cloud Firestore, tek bir sorguda birden fazla alanda aralık ve eşitsizlik filtrelerinin kullanılmasını destekler. Birden fazla alanda aralık ve eşitsizlik koşulları kullanabilir ve filtreleme sonrası mantığın uygulanmasını Cloud Firestore hizmetine devrederek uygulama geliştirme sürecinizi basitleştirebilirsiniz.

Birden fazla alanda aralık ve eşitsizlik filtreleri

Aşağıdaki sorgu, nüfusu 1.000.000'dan fazla ve nüfus yoğunluğu birim alan başına 10.000 kişiden az olan tüm şehirleri döndürmek için nüfus ve yoğunluk üzerinde aralık filtreleri kullanır.

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

$collection = $db->collection('samples/php/cities');
$chainedQuery = $collection
    ->where('population', '>', 1000000)
    ->where('density', '<', 10000);

C#

CollectionReference citiesRef = db.Collection("cities");
Query query = citiesRef
    .WhereGreaterThan("Population", 1000000)
    .WhereLessThan("Density", 10000);
QuerySnapshot querySnapshot = await query.GetSnapshotAsync();
foreach (DocumentSnapshot documentSnapshot in querySnapshot)
{
    var name = documentSnapshot.GetValue<string>("Name");
    var population = documentSnapshot.GetValue<int>("Population");
    var density = documentSnapshot.GetValue<int>("Density");
    Console.WriteLine($"City '{name}' returned by query. Population={population}; Density={density}");
}

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 gerekenler

Sorgularınızı çalıştırmadan önce [sorgular][1] ve Cloud Firestore [veri modeli][2] hakkında bilgi edinin.

Cloud Firestore içinde, bir sorgunun ORDER BY yan tümcesi, 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 bileşik dizin gerektirir.

Cloud Firestore sorgularının performansını ve maliyetini optimize etmek için dizindeki alanların sırasını optimize edin. Bunu yapmak için dizininizin soldan sağa doğru sıralandığından emin olun. Böylece sorgu, gereksiz dizin girişlerinin taranmasını önleyen bir veri kümesine indirgenir.

Bir çalışan koleksiyonunda arama yaparak maaşı 100.000 ABD dolarından fazla olan ve 0 yıldan fazla deneyime sahip ABD'li çalışanları bulmak istediğinizi varsayalım. Veri kümesini incelediğinizde maaş kısıtlamasının deneyim kısıtlamasından daha seçici olduğunu fark ettiniz. Dizin taramalarının sayısını azaltacak ideal dizin (salary [...], experience [...]) olur. Bu nedenle, hızlı ve uygun maliyetli sorgu, salary ifadesini experience ifadesinden önce sıralar 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 etmeyle ilgili en iyi uygulamalar

Dizinleri optimize ederken aşağıdaki en iyi uygulamaları göz önünde bulundurun.

Dizin alanlarını eşitliklere, ardından en seçici aralığa veya eşitsizlik alanına göre sıralayın.

Cloud Firestore, eşitlik kısıtlamalarını ve orderBy() sorgusunun ilk alanındaki aralık veya 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 tarafından taranan 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 tarafından taranan dizin girişlerinin sayısını azaltmaz ancak eşleşmeyen dokümanları filtreleyerek istemcilere döndürülen doküman sayısını azaltır.

Verimli dizinler oluşturma hakkında daha fazla bilgi için [dizin özellikleri][4] bölümüne bakın.

Alanları, sorgu kısıtlaması seçiciliğine göre azalan düzende sıralayın.

Cloud Firestore sorgunuz için en uygun dizini seçtiğinden emin olmak için sorgu kısıtlama seçiciliğinin azalan sırasına göre alanları sıralayan bir orderBy() ifadesi belirtin. Yüksek seçicilik, daha küçük bir belge alt kümesiyle eşleşirken düşük seçicilik, daha büyük bir belge alt kümesiyle eşleşir. Daha yüksek seçiciliğe sahip aralık veya eşitsizlik alanlarını, dizin sıralamasında daha düşük seçiciliğe sahip alanlardan önce seçtiğinizden emin olun.

Cloud Firestore tarafından taranan ve ağ üzerinden döndürülen belge sayısını en aza indirmek için alanları her zaman sorgu kısıtlaması seçiciliğine 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 sıralama beklentinize göre yeniden sıralamak için istemci tarafı mantığı uygulayabilirsiniz.

Örneğin, bir çalışan koleksiyonunda arama yaparak maaşı 100.000 ABD dolarından fazla olan ABD'li çalışanları bulmak 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 ABD dolarından fazla olmasını bekliyorsanız sorguyu yazmanın en verimli yolu şöyledir:

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 üzerinde bir sıralama eklemek aynı belge kümesini döndürür ve istemcilerde sonuçların yeniden sıralanması ihtiyacını ortadan kaldırır. Ancak sorgu, önceki sorguya göre çok daha fazla sayıda alakasız dizin girişi okuyabilir. Bunun nedeni, Cloud Firestore dizininin her zaman, dizin alanları ön eki sorgunun order by yan tümcesiyle eşleşen bir dizini tercih etmesidir. ORDER BY yan tümcesine experience eklenirse 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ç kümesini bulmak için salary filtresini uygulamadan önce employees koleksiyonunun tüm dizin girişlerini okur. Bu, salary filtresini karşılamayan dizin girişlerinin de okunduğu, dolayısıyla sorgunun gecikme süresinin ve maliyetinin arttığı anlamına gelir.

Fiyatlandırma

Birden fazla alanda aralık ve eşitsizlik filtreleri içeren sorgular, okunan dokümanlara ve okunan dizin girişlerine göre faturalandırılır.

Ayrıntılı bilgi için [Fiyatlandırma][5] sayfasını inceleyin.

Sınırlamalar

[Sorgu sınırlamalarının][6] yanı sıra, birden fazla alanda aralık ve eşitsizlik filtreleri içeren sorguları kullanmadan önce aşağıdaki sınırlamaları göz önünde bulundurun:

  • Doküman alanlarında aralık veya eşitsizlik filtreleri ve doküman anahtarı (__name__) üzerinde yalnızca 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ırlar. Bu, sorguların çalıştırılmasının çok pahalı olmasını önlemek içindir.

Sırada ne var?

  • <a href="https://cloud.google.com/bigquery/docs/best-practices-performance-overview">[Sorgularınızı optimize etme]</a> hakkında bilgi edinin.
  • [Basit ve bileşik sorgular gerçekleştirme][8] hakkında daha fazla bilgi edinin.
  • [Cloud Firestore dizinleri nasıl kullanır?][9]

[1]: /docs/firestore/query-data/get-data [2]: /docs/firestore/data-model [3]: /docs/firestore/query-data/multiple-range-optimize-indexes [4]: /docs/firestore/concepts/index-overview#index_properties [5]: /docs/firestore/pricing [6]: /docs/firestore/query-data/queries#query_limitations [7]: https://en.wikipedia.org/wiki/Disjunctive_normal_form [8]: /docs/firestore/query-data/queries [9]: /docs/firestore/concepts/index-overview [10]: /docs/firestore/query-data/multiple-range-optimize-indexes