تتيح 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
#C
لغة 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. ويساهم ذلك في تجنّب أن تصبح طلبات البحث باهظة الثمن. لتشغيله.
الخطوات التالية
- تعرَّف على كيفية تحسين طلبات البحث.
- تعرّف على مزيد من المعلومات عن إجراء طلبات بحث بسيطة ومركبة.
- يمكنك فهم طريقة استخدام Cloud Firestore للفهارس.