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

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

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

يستخدم الطلب التالي فلاتر النطاقات للسكان والكثافة من أجل عرض كل المدن التي يزيد عدد سكانها عن 1,000,000 نسمة وكثافة سكانها أقل من 10,000 نسمة لكل وحدة مساحة.

الإصدار 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 وتقليل تكلفتها، حسِّن ترتيب الحقول في الفهرس. لإجراء ذلك، تأكَّد من أنّ فهرسك مرتب من اليمين إلى اليسار بحيث يتم تجميع الاستعلام في مجموعة بيانات تمنع فحص إدخالات الفهرس غير الضرورية.

لنفترض أنّك تريد البحث في مجموعة من الموظفين والعثور على موظفي الولايات المتحدة الذين يزيد راتبهم عن 100,000 دولار أمريكي وعدد سنوات خبرتهم أكبر من 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 ويعرضها على الشبكة، يجب ترتيب الحقول دائمًا بترتيب تناقصي لاختيار قيد طلب البحث. إذا لم تكن مجموعة النتائج بالترتيب المطلوب وكان من المتوقّع أن تكون مجموعة النتائج صغيرة، يمكنك تنفيذ منطق من جهة العميل لإعادة ترتيبها وفقًا لتوقعاتك بشأن الترتيب.

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

جافا

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 يفضّل دائمًا الفهرس الذي تتطابق بادئة حقول الفهرس فيه مع عبارة order by في طلب البحث. إذا تمت إضافة experience إلى عبارة الترتيب حسب، سيختار Cloud Firestore مؤشر (experience [...], salary [...]) لحساب نتائج طلب البحث. بما أنّه ما مِن قيود أخرى مفروضة على experience، ستقرأ Cloud Firestore جميع إدخالات الفهرس الخاصة بمجموعة employees قبل تطبيق فلتر salary للعثور على مجموعة النتائج النهائية. وهذا يعني أنّه لا يزال يتم قراءة إدخالات الفهرس التي لا تستوفي فلتر salary ، ما يؤدي إلى زيادة وقت الاستجابة وتكلفة الاستعلام.

الأسعار

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

للحصول على معلومات تفصيلية، يُرجى الاطّلاع على صفحة الأسعار.

القيود

بالإضافة إلى قيود طلبات البحث، يُرجى ملاحظة القيود التالية قبل استخدام طلبات البحث التي تتضمّن فلاتر النطاقات وعدم المساواة في حقول متعددة:

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

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