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. 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'a gidin.

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

$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 gereken noktalar

Sorgularınızı çalıştırmadan ö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 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 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 dizin sayısını azaltabilir 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 dizin özellikleri konusuna 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 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 gereksiz dizin girişi okumasını sağlar. Çü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 için de kullanılabilir. 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.

Sırada ne var?