نظرة عامة على طلب البحث الذي يتضمّن فلاتر النطاق وعدم المساواة في حقول متعدّدة

تتيح Cloud Firestore استخدام فلاتر النطاقات وعدم المساواة في عدة حقول ضمن طلب بحث واحد. يمكنك الحصول على شروط النطاق والمتباينة في حقول متعددة وتبسيط تطوير التطبيق من خلال تفويض تنفيذ منطق ما بعد التصفية إلى Cloud Firestore.

فلاتر النطاق والمتباينة في حقول متعددة

يستخدم الاستعلام التالي فلاتر النطاق على السكان والكثافة لعرض جميع المدن التي يزيد فيها عدد السكان عن 1000000 شخص والكثافة السكانية أقل من 10000 شخص لكل وحدة من المساحة.

الإصدار 9 من الويب النموذجي

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)

انتقال

   query := client.Collection("cities").
      Where("population", ">", 1000000).
      Where("density", "<", 10000)

جافا

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

اعتبارات الفهرسة

قبل تشغيل الاستعلامات، اقرأ حول طلبات البحث ونموذج بيانات Cloud Firestore

في Cloud Firestore، تحدد العبارة ORDER BY في طلب البحث الفهارس. يمكن استخدامها لخدمة الاستعلام. على سبيل المثال، طلب البحث ORDER BY a ASC, b ASC يجب توفّر فهرس مركب في حقول a ASC, b ASC.

لتحسين أداء طلبات بحث Cloud Firestore وتكلفتها، تحسين ترتيب الحقول في الفهرس. للقيام بذلك، تأكد من أن الفهرس الخاص بك مرتبة من اليسار إلى اليمين بحيث يتم استخلاص الاستعلام إلى مجموعة بيانات يمنع فحص إدخالات الفهرس غير الضرورية.

لنفترض أنك تريد البحث في مجموعة من الموظفين والبحث عن الولايات المتحدة الموظفين الذين تزيد راتبهم عن 100000 دولار وعدد سنوات خبرتهم أكبر من 0. بناءً على فهمك لمجموعة البيانات، فأنت تعلم أن قيد الراتب أكثر انتقائية من قيد الخبرة. المثالي الفهرس الذي من شأنه تقليل عدد عمليات فحص الفهرس هو (salary [...], experience [...]) وبالتالي، فإن الاستعلام الذي سيكون سريعًا فعّالة من حيث التكلفة ستطلب salary قبل experience وتبدو على النحو التالي:

جافا

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");

أفضل الممارسات لتحسين الفهارس

عند تحسين المؤشرات، يُرجى ملاحظة أفضل الممارسات التالية.

حقول فهرس الترتيب حسب علامة يساوي متبوعة بالنطاق الأكثر انتقائية أو حقل عدم مساواة

وتستخدم Cloud Firestore الحقول في أقصى اليسار من ال��هرس المركب لتلبية قيود المساواة وقيد النطاق أو عدم المساواة، إن وجد، في الحقل الأول استعلام orderBy(). ويمكن لهذه القيود أن تقلل من عدد الأعمدة الإدخالات التي تفحصها Cloud Firestore. تستخدم Cloud Firestore الحقول المتبقية الفهرس لتلبية قيود النطاق الأخرى أو قيود عدم المساواة في الاستعلام. هذه القيود لا ت��ل�� من عدد ��دخالات الفهرس التي تفحصها Cloud Firestore ولكن تصفية المستندات غير المتطابقة بحيث يكون عدد المستندات يتم تقليل الإيرادات إلى العملاء.

لمزيد من المعلومات حول إنشاء فهارس فعّالة، يُرجى الاطّلاع على خصائص الفهرس.

ترتيب الحقول بترتيب متناقص من الانتقائية لقيد طلب البحث

لضمان أنّ Cloud Firestore تختار الفهرس الأمثل لطلب البحث، تحديد عبارة orderBy() لترتيب الحقول بترتيب تنازلي حسب طلب البحث وقيود الانتقائية. تتطابق الانتقائية الأعلى مع مجموعة فرعية أصغر من مستندات، بينما تتطابق الانتقائية الأقل مع مجموعة فرعية أكبر من المستندات. تأكَّد من فإنك تحدد حقول النطاق أو المتباينة ذات الانتقائية الأعلى في وقت سابق من الفهرس ترتيب أكثر من الحقول ذات الانتقائية الأقل.

لتقليل عدد المستندات التي تفحصها Cloud Firestore وترجعها الشبكة، فيجب عليك دائمًا ترتيب الحقول بالترتيب التنازلي لطلبات البحث وقيود الانتقائية. إذا لم تكن مجموعة النتائج بالترتيب المطلوب وكانت من المتوقع أن تكون مجموعة النتائج صغيرة، فيمكنك تطبيق منطق من جهة العميل وإعادة طلبه وفقًا لتوقعات الطلب.

على سبيل المثال، لنفترض أنك تريد البحث عبر مجموعة من الموظفين للعثور على موظفو الولايات المتحدة الذين تزيد راتبهم عن 100000 دولار ويطلبون النتائج حسب سنة خبرة الموظف. إذا كنت تتوقع حصول عدد قليل فقط من الموظفين على رواتب أكبر من 100000 دولار، فإن الطريقة الأكثر فاعلية لكتابة الاستعلام هي كما يلي:

جافا

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`

سينتج عن إضافة ترتيب على experience إلى طلب البحث نفس المجموعة المستندات وتجنب إعادة ترتيب النتائج على العملاء، قد يؤدي ��لاستعلام قراءة العديد من إدخالات الفهرس غير الضرورية من الاستعلام السابق. هذا بسبب تفضل Cloud Firestore دائمًا فهرسًا تتطابق بادئة حقول الفهرس فيه الترتيب حسب عبارة الاستعلام. إذا تمت إضافة experience إلى الترتيب حسب العبارة، فستختار Cloud Firestore فهرس (experience [...], salary [...]) لحساب نتائج الاستعلام. نظرًا لعدم وجود قيود أخرى على experience، سيقرأ Cloud Firestore جميع إدخالات الفهرس مجموعة employees قبل تطبيق الفلتر salary للعثور على المجموعة النهائية مجموعة النتائج. وهذا يعني أنّ الإدخالات في الفهرس لا تستوفي متطلبات salary لا تزال تتم قراءة عامل التصفية، مما يؤدي إلى زيادة وقت الاستجابة وتكلفة طلب البحث.

الأسعار

تتم فوترة طلبات البحث التي تحتوي على فلاتر للنطاق وعدم المساواة في حقول متعددة استنادًا إلى المستندات التي تمت قراءتها وإدخالات الفهرس.

للحصول على معلومات تفصيلية، انتقِل إلى صفحة الأسعار.

القيود

بخلاف قيود طلب البحث، لاحظ القيود التالية قبل استخدام طلبات البحث بفلاتر النطاق وعدم المساواة في حقول متعددة:

  • الطلبات التي تحتوي على فلاتر للنطاق أو عدم المساواة في حقول المستندات ويساوي فقط القيود المفروضة على مفتاح المستند (__name__) غير متاحة.
  • تحدد Cloud Firestore عدد النطاقات أو حقول عدم المساواة ليكون 10. ويساهم ذلك في تجنّب أن تصبح طلبات البحث باهظة الثمن. لتشغيله.

الخطوات التالية