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

تتيح 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)

جافا

  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 وتبدو على النحو التالي:

جافا

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

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