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