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

تتيح 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. ويساهم ذلك في تجنّب أن تصبح طلبات البحث باهظة الثمن. لتشغيله.

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