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

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

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

يعرض الاستعلام التالي جميع المستخدمين الذين تزيد أعمارهم عن 35 وطولهم يتراوح بين 60 و70 باستخدام فلاتر النطاق على العمر والطول.

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

  const q = query(
      collection(db, "users"),
      where('age', '>', 35),
      where('height', '>', 60),
      where('height', '<', 70)
    );

Swift

 let query = db.collection("users")
   .whereField("age", isGreaterThan: 35)
   .whereField("height", isGreaterThan: 60)
   .whereField("height", isLessThan: 70)

Objective-C

 FIRQuery *query = 
  [[[[self.db collectionWithPath:@"users"]
 queryWhereField:@"age" isGreaterThan:@35]
    queryWhereField:@"height" isGreaterThan:@60] 
        queryWhereField:@"height" isLessThan:@70];

Java لنظام Android

 Query query = db.collection("users")
  .whereGreaterThan("age", 35)
  .whereGreaterThan("height", 60)
  .whereLessThan("height", 70);

Kotlin+KTX على Android

 val query = db.collection("users")
  .whereGreaterThan("age", 35)
  .whereGreaterThan("height", 60)
  .whereLessThan("height", 70)

Java

  db.collection("users")
    .whereGreaterThan("age", 35)
    .whereGreaterThan("height", 60)
    .whereLessThan("height", 70);

Node.js

db.collection("users")
  .where('age', '>', 35),
  .where('height', '>', 60),
  .where('height', '<', 70)

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

قبل بدء تشغيل طلبات البحث، احرص على الاطّلاع على طلبات البحث ونموذج بيانات Cloud Firestore.

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

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

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

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

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

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

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

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

لمزيد من المعلومات حول إنشاء فهارس فعالة، يمكنك الاطّلاع على المقالة تعريف فهرس مثالي.

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

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

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

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

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`

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

الأسعار

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

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

القيود

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

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

ما هي الخطوات التالية؟