أنواع الفهرس في Cloud Firestore

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

تصف هذه الصفحة نوعي الفهارس التي يستخدمها Cloud Firestore، الفهارس أحادية الحقل والفهارس المركبة .

فهرس وراء كل استعلام

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

إدارة أقل للفهرس، والمزيد من تطوير التطبيقات

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

أنواع الفهرس

يستخدم Cloud Firestore نوعين من الفهارس: حقل واحد ومركب . بالإضافة إلى عدد الحقول المفهرسة، تختلف الفهارس أحادية الحقل والفهارس المركبة في كيفية إدارتها.

فهارس الحقل الواحد

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

الفهرسة التلقائية

افتراضيًا، يحتفظ Cloud Firestore تلقائيًا بفهارس الحقول الفردية لكل حقل في المستند وكل حقل فرعي في الخريطة. يستخدم Cloud Firestore الإعدادات الافتراضية التالية للفهارس أحادية الحقل:

  • لكل حقل غير مصفوفة وغير خريطة، يحدد Cloud Firestore فهرسين لحقل واحد لنطاق المجموعة، أحدهما في الوضع التصاعدي والآخر في الوضع التنازلي.

  • لكل حقل خريطة، يقوم Cloud Firestore بإنشاء ما يلي:

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

  • لا يتم الحفاظ على فهارس الحقول المفردة ذات نطاق مجموعة المجموعة بشكل افتراضي.

استثناءات فهرس الحقل الواحد

يمكنك استثناء حقل من إعدادات الفهرسة التلقائية عن طريق إنشاء استثناء فهرس لحقل واحد. يتجاوز استثناء الفهرسة إعدادات الفهرس التلقائي على مستوى قاعدة البيانات. يمكن أن يؤدي الاستثناء إلى تمكين فهرس حقل واحد، والذي قد تقوم إعدادات الفهرسة التلقائية الخاصة بك بتعطيله أو تعطيله، وإلا فإن الفهرسة التلقائية قد تقوم بتمكينه. بالنسبة للحالات التي يمكن أن تكون فيها الإعفاءات مفيدة، راجع أفضل ممارسات الفهرسة .

استخدم قيمة مسار الحقل * لإضافة استثناءات الفهرس على مستوى المجموعة في كافة الحقول في مجموعة المجموعة. على سبيل المثال، بالنسبة comments مجموعة المجموعة، قم بتعيين مسار الحقل إلى * لمطابقة جميع الحقول في مجموعة مجموعة comments وتعطيل فهرسة جميع الحقول الموجودة ضمن مجموعة المجموعة. يمكنك بعد ذلك إضافة استثناءات لفهرسة الحقول المطلوبة لاستفساراتك فقط. يؤدي تقليل عدد الحقول المفهرسة إلى تقليل تكاليف التخزين ويمكن أن يؤدي إلى تحسين أداء الكتابة.

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

لإنشاء وإدارة استثناءات الفهرس أحادي الحقل، راجع إدارة الفهارس في Cloud Firestore .

الفهارس المركبة

يخزن الفهرس المركب تعيينًا مفروزًا لجميع المستندات الموجودة في المجموعة، استنادًا إلى قائمة مرتبة من الحقول المراد فهرستها.

يستخدم Cloud Firestore فهارس مركبة لدعم الاستعلامات غير المدعومة بالفعل بواسطة فهارس الحقل الواحد.

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

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

أوضاع الفهرس ونطاقات الاستعلام

يمكنك تكوين الفهارس ذات الحقل الواحد والفهارس المركبة بشكل مختلف، لكن كلاهما يتطلب تكوين أوضاع الفهرس ونطاقات الاستعلام للفهارس الخاصة بك.

أوضاع الفهرس

عندما تقوم بتعريف فهرس، فإنك تحدد وضع فهرس لكل حقل مفهرس. يدعم وضع الفهرس الخاص بكل حقل عبارات استعلام محددة في هذا الحقل. يمكنك الاختيار من بين أوضاع الفهرس التالية:

وضع الفهرس وصف
تصاعدي_للأعلى يدعم عبارات الاستعلام < , <= , == , >= , > , != , in و not-in في الحقل ويدعم فرز النتائج بترتيب تصاعدي بناءً على قيمة الحقل هذه.
تنازلي_للأسفل يدعم عبارات الاستعلام < و <= == >= > != و in و not-in في الحقل ويدعم فرز النتائج بترتيب تنازلي بناءً على قيمة الحقل هذه.
صفيف يحتوي على يدعم array-contains array-contains-any عبارات استعلام في الحقل.

نطاقات الاستعلام

يتم تحديد نطاق كل فهرس إما لمجموعة أو مجموعة تجميع. يُعرف هذا بنطاق استعلام الفهرس:

نطاق التجميع
يقوم Cloud Firestore بإنشاء فهارس بنطاق المجموعة افتراضيًا. تدعم هذه الفهارس الاستعلامات التي ترجع النتائج من مجموعة واحدة.

نطاق مجموعة التجميع
تتضمن مجموعة المجموعة كافة المجموعات التي لها نفس معرف المجموعة. لتشغيل استعلام مجموعة مجموعة يقوم بإرجاع النتائج المصفاة أو المرتبة من مجموعة مجموعة، يجب عليك إنشاء فهرس مطابق بنطاق مجموعة المجموعة.

الترتيب الافتراضي والحقل __name__

بالإضافة إلى فرز المستندات حسب أوضاع الفهرس المحددة لكل حقل (تصاعدي أو تنازلي)، تطبق الفهارس فرزًا نهائيًا حسب حقل __name__ لكل مستند. يتم تعيين قيمة الحقل __name__ على مسار المستند الكامل. وهذا يعني أن المستندات الموجودة في مجموعة النتائج والتي لها نفس قيم الحقول يتم فرزها حسب مسار المستند.

افتراضيًا، يتم فرز الحقل __name__ في نفس اتجاه آخر حقل تم فرزه في تعريف الفهرس. على سبيل المثال:

مجموعة الحقول مفهرسة نطاق الاستعلام
مدن اسم ، __name__ مجموعة
مدن حالة ، __name__ مجموعة
مدن دولة ، عدد السكان، __name__ مجموعة

لفرز النتائج حسب الاتجاه غير الافتراضي __name__ ، تحتاج إلى إنشاء هذا الفهرس.

مثال الفهرسة

من خلال إنشاء فهارس ذات حقل واحد تلقائيًا لك، يسمح Cloud Firestore لتطبيقك بدعم استعلامات قاعدة البيانات الأساسية بسرعة. تسمح لك فهارس الحقل الواحد بإجراء استعلامات بسيطة بناءً على قيم الحقول والمقارنات < , <= , == , >= , > , in . بالنسبة لحقول المصفوفة، فهي تسمح لك بتنفيذ array-contains array-contains-any استعلامات.

للتوضيح، قم بفحص الأمثلة التالية من وجهة نظر إنشاء الفهرس. يقوم المقتطف التالي بإنشاء عدد قليل من مستندات city في مجموعة cities ويعين حقول name state country ورأس capital population tags لكل مستند:

ويب
var citiesRef = db.collection("cities");

citiesRef.doc("SF").set({
    name: "San Francisco", state: "CA", country: "USA",
    capital: false, population: 860000,
    regions: ["west_coast", "norcal"] });
citiesRef.doc("LA").set({
    name: "Los Angeles", state: "CA", country: "USA",
    capital: false, population: 3900000,
    regions: ["west_coast", "socal"] });
citiesRef.doc("DC").set({
    name: "Washington, D.C.", state: null, country: "USA",
    capital: true, population: 680000,
    regions: ["east_coast"] });
citiesRef.doc("TOK").set({
    name: "Tokyo", state: null, country: "Japan",
    capital: true, population: 9000000,
    regions: ["kanto", "honshu"] });
citiesRef.doc("BJ").set({
    name: "Beijing", state: null, country: "China",
    capital: true, population: 21500000,
    regions: ["jingjinji", "hebei"] });

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

مجموعة تمت فهرسة الحقل نطاق الاستعلام
مدن اسم مجموعة
مدن حالة مجموعة
مدن دولة مجموعة
مدن رأس المال مجموعة
مدن عدد السكان مجموعة
مدن اسم مجموعة
مدن حالة مجموعة
مدن دولة مجموعة
مدن رأس المال مجموعة
مدن عدد السكان مجموعة
مدن array-contains مناطق مجموعة

الاستعلامات المدعومة بفهرسة الحقل الواحد

باستخدام هذه الفهارس أحادية الحقل التي تم إنشاؤها تلقائيًا، يمكنك تشغيل استعلامات بسيطة مثل ما يلي:

ويب
const stateQuery = citiesRef.where("state", "==", "CA");
const populationQuery = citiesRef.where("population", "<", 100000);
const nameQuery = citiesRef.where("name", ">=", "San Francisco");

يمكنك أيضًا إنشاء استعلامات المساواة ( == ) in :

ويب
citiesRef.where('country', 'in', ["USA", "Japan", "China"])

// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
         .where("capital", "==", false)
         .where("state", "==", "CA")
         .where("population", "==", 860000)

إذا كنت تريد تشغيل استعلام مركب يستخدم مقارنة النطاق ( < أو <= أو > أو >= ) أو إذا كنت تريد الفرز حسب حقل مختلف، فيجب عليك إنشاء فهرس مركب لهذا الاستعلام.

يسمح لك فهرس array-contains بالاستعلام عن حقل مصفوفة regions :

ويب
citiesRef.where("regions", "array-contains", "west_coast")
// array-contains-any and array-contains use the same indexes
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])

الاستعلامات المدعومة بالفهارس المركبة

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

ويب
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)

تتطلب هذه الاستعلامات الفهرس المركب أدناه. بما أن الاستعلام يستخدم المساواة ( == أو in ) لحقل country ، فيمكنك استخدام وضع الفهرس التصاعدي أو التنازلي لهذا الحقل. افتراضيًا، تطبق عبارات عدم المساواة ترتيب فرز تصاعدي استنادًا إلى الحقل الموجود في جملة عدم المساواة.

مجموعة الحقول مفهرسة نطاق الاستعلام
مدن دولة (أو )، وعدد السكان مجموعة

لتشغيل نفس الاستعلامات ولكن بترتيب فرز تنازلي، تحتاج إلى فهرس مركب إضافي في الاتجاه التنازلي لعدد population :

ويب
citiesRef.where("country", "==", "USA").orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", "<", 3800000)
         .orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", ">", 690000)
         .orderBy("population", "desc")

citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)
         .orderBy("population", "desc")
مجموعة الحقول مفهرسة نطاق الاستعلام
مدن دولة ، عدد السكان مجموعة
مدن دولة ، عدد السكان مجموعة

تحتاج أيضًا إلى إنشاء فهرس مركب لدمج استعلام array-contains أو array-contains-any مع عبارات إضافية.

ويب
citiesRef.where("regions", "array-contains", "east_coast")
         .where("capital", "==", true)

// array-contains-any and array-contains use the same index
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
         .where("capital", "==", true)
مجموعة الحقول مفهرسة نطاق الاستعلام
مدن تحتوي المصفوفة على علامات، بحرف كبير (أو ). مجموعة

الاستعلامات المدعومة بفهرسات مجموعة المجموعة

لتوضيح فهرس بنطاق مجموعة المجموعة، تخيل أنك تضيف مجموعة فرعية landmarks إلى بعض وثائق city :

ويب
var citiesRef = db.collection("cities");

citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Bridge",
    category : "bridge" });
citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Park",
    category : "park" });

citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Gallery of Art",
    category : "museum" });
citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Mall",
    category : "park" });

باستخدام فهرس الحقل الفردي التالي مع نطاق المجموعة، يمكنك الاستعلام عن مجموعة landmarks مدينة واحدة بناءً على حقل category :

مجموعة الحقول مفهرسة نطاق الاستعلام
معالم فئة (أو ). مجموعة
ويب
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

الآن، تخيل أنك مهتم بالاستعلام عن المعالم في جميع المدن. لتشغيل هذا الاستعلام على مجموعة المجموعة التي تتكون من جميع مجموعات landmarks ، يجب عليك تمكين فهرس landmarks ذو الحقل الواحد بنطاق مجموعة المجموعة:

مجموعة الحقول مفهرسة نطاق الاستعلام
معالم فئة (أو ). مجموعة التجميع

مع تمكين هذا الفهرس، يمكنك الاستعلام عن مجموعة جمع landmarks :

ويب
var landmarksGroupRef = db.collectionGroup("landmarks");

landmarksGroupRef.where("category", "==", "park")
landmarksGroupRef.where("category", "in", ["park", "museum"])

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

على سبيل المثال، يمكنك تشغيل استعلام مجموعة المجموعة التالي دون تمكين فهرس إضافي:

ويب
db.collectionGroup("landmarks").get()

إدخالات الفهرس

تحدد الفهارس التي تم تكوينها لمشروعك وبنية المستند عدد إدخالات الفهرس للمستند. يتم احتساب إدخالات الفهرس ضمن الحد الأقصى لعدد إدخالات الفهرس .

يوضح المثال التالي إدخالات الفهرس للمستند.

وثيقة

/cities/SF

city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

فهارس الحقل الواحد

  • city_name ASC
  • اسم المدينة DESC
  • درجات الحرارة.الصيف ASC
  • درجات الحرارة.الصيف DESC
  • درجات الحرارة.الشتاء ASC
  • درجات الحرارة.فصل الشتاء DESC
  • مصفوفة الأحياء تحتوي على (ASC و DESC)

الفهارس المركبة

  • city_name ASC، الأحياء ARRAY
  • city_name DESC، الأحياء ARRAY

إدخالات الفهرس

ينتج عن تكوين الفهرسة هذا إدخالات الفهرس الـ 18 التالية للمستند:

فِهرِس البيانات المفهرسة
إدخالات فهرس الحقل الواحد
city_name ASC اسم المدينة: "سان فرانسيسكو"
اسم المدينة DESC اسم المدينة: "سان فرانسيسكو"
درجات الحرارة.الصيف ASC درجات الحرارة.الصيف: 67
درجات الحرارة.الصيف DESC درجات الحرارة.الصيف: 67
درجات الحرارة.الشتاء ASC درجات الحرارة في الشتاء: 55
درجات الحرارة.فصل الشتاء DESC درجات الحرارة في الشتاء: 55
صفيف الأحياء يحتوي على ASC الأحياء: "المهمة"
مصفوفة الأحياء تحتوي على DESC الأحياء: "المهمة"
صفيف الأحياء يحتوي على ASC أحياء: "وسط المدينة"
مصفوفة الأحياء تحتوي على DESC أحياء: "وسط المدينة"
صفيف الأحياء يحتوي على ASC أحياء: "مارينا"
مصفوفة الأحياء تحتوي على DESC أحياء: "مارينا"
إدخالات الفهرس المركب
city_name ASC، الأحياء ARRAY اسم المدينة: "سان فرانسيسكو"، الأحياء: "المهمة"
city_name ASC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "وسط المدينة"
city_name ASC، الأحياء ARRAY اسم المدينة: "سان فرانسيسكو"، الأحياء: "مارينا"
city_name DESC، الأحياء ARRAY اسم المدينة: "سان فرانسيسكو"، الأحياء: "المهمة"
city_name DESC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "وسط المدينة"
city_name DESC، الأحياء ARRAY اسم المدينة: "سان فرانسيسكو"، الأحياء: "مارينا"

المؤشرات والتسعير

تساهم الفهارس في تكاليف تخزين التطبيق الخاص بك. لمزيد من المعلومات حول كيفية حساب حجم تخزين الفهارس، راجع حجم إدخال الفهرس .

الاستفادة من دمج الفهرس

على الرغم من أن Cloud Firestore يستخدم فهرسًا لكل استعلام، إلا أنه لا يتطلب بالضرورة فهرسًا واحدًا لكل استعلام. بالنسبة للاستعلامات التي تحتوي على عدة عبارات مساواة ( == ) وعبارة orderBy اختياريًا، يمكن لـ Cloud Firestore إعادة استخدام الفهارس الموجودة. يمكن لـ Cloud Firestore دمج الفهارس لمرشحات المساواة البسيطة لإنشاء الفهارس المركبة اللازمة لاستعلامات المساواة الأكبر.

يمكنك تقليل تكاليف الفهرسة عن طريق تحديد المواقف التي يمكنك فيها الاستفادة من دمج الفهرس. على سبيل المثال، تخيل مجموعة restaurants لتطبيق تقييم المطاعم:

  • المطاعم

    • برغرثيم

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

الآن، تخيل أن هذا التطبيق يستخدم استعلامات مثل تلك الموجودة أدناه. لاحظ أن التطبيق يستخدم مجموعات من بنود المساواة category city و editors_pick بينما يقوم دائمًا بالفرز حسب تصنيف star_rating التصاعدي:

ويب
db.collection("restaurants").where("category", "==", "burgers")
                            .orderBy("star_rating")

db.collection("restaurants").where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==" "San Francisco")
                            .where("editors_pick", "==", true )
                            .orderBy("star_rating")

يمكنك إنشاء فهرس لكل استعلام:

مجموعة الحقول مفهرسة نطاق الاستعلام
المطاعم فئة ، تصنيف النجوم مجموعة
المطاعم مدينة ، تصنيف النجوم مجموعة
المطاعم فئة ، مدينة ، تصنيف النجوم مجموعة
المطاعم فئة ، مدينة ، ، مجموعة

كحل أفضل، يمكنك تقليل عدد الفهارس من خلال الاستفادة من قدرة Cloud Firestore على دمج الفهارس لبنود المساواة:

مجموعة الحقول مفهرسة نطاق الاستعلام
المطاعم فئة ، تصنيف النجوم مجموعة
المطاعم مدينة ، تصنيف النجوم مجموعة
المطاعم Editors_pick، Star_Rating مجموعة

هذه المجموعة من الفهارس ليست أصغر حجمًا فحسب، بل إنها تدعم أيضًا استعلامًا إضافيًا:

ويب
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

حدود الفهرسة

تنطبق الحدود التالية على الفهارس. للتعرف على جميع الحصص والحدود، راجع الحصص والحدود .

حد تفاصيل
الحد الأقصى لعدد الفهارس المركبة لقاعدة البيانات
الحد الأقصى لعدد تكوينات الحقل الواحد لقاعدة البيانات

يمكن أن يحتوي تكوين واحد على مستوى الحقل على تكوينات متعددة لنفس الحقل. على سبيل المثال، يتم احتساب استثناء فهرسة الحقل الواحد وسياسة TTL على نفس الحقل كتكوين حقل واحد نحو الحد الأقصى.

الحد الأقصى لعدد إدخالات الفهرس لكل مستند

40.000

عدد إدخالات الفهرس هو مجموع ما يلي للمستند:

  • عدد إدخالات الفهرس أحادية الحقل
  • عدد إدخالات الفهرس المركب

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

الحد الأقصى لعدد الحقول في فهرس مركب 100
الحد الأقصى لحجم إدخال الفهرس

7.5 كيلو بايت

لمعرفة كيفية قيام Cloud Firestore بحساب حجم إدخال الفهرس، راجع حجم إدخال الفهرس .

الحد الأقصى لمجموع أحجام إدخالات فهرس المستند

8 ميجابايت

الحجم الإجمالي هو مجموع ما يلي للمستند:

  • مجموع حجم إدخالات الفهرس أحادية الحقل للمستند
  • مجموع حجم إدخالات الفهرس المركب للمستند
  • الحد الأقصى لحجم قيمة الحقل المفهرسة

    1500 بايت

    يتم اقتطاع قيم الحقول التي تزيد عن 1500 بايت. قد تؤدي الاستعلامات التي تتضمن قيم الحقول المقتطعة إلى إرجاع نتائج غير متناسقة.

    أفضل ممارسات الفهرسة

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

    قضية وصف
    حقول سلسلة كبيرة

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

    معدلات كتابة عالية لمجموعة تحتوي على مستندات ذات قيم متسلسلة

    إذا قمت بفهرسة حقل يزيد أو ينقص بشكل تسلسلي بين المستندات في مجموعة، مثل الطابع الزمني، فإن الحد الأقصى لمعدل الكتابة إلى المجموعة هو 500 عملية كتابة في الثانية. إذا لم تقم بالاستعلام بناءً على الحقل الذي يحتوي على قيم تسلسلية، فيمكنك استثناء الحقل من الفهرسة لتجاوز هذا الحد.

    في حالة استخدام إنترنت الأشياء ذات معدل الكتابة المرتفع، على سبيل المثال، قد تقترب مجموعة تحتوي على مستندات ذات حقل طابع زمني من حد 500 عملية كتابة في الثانية.

    حقول TTL

    إذا كنت تستخدم سياسات TTL (مدة البقاء) ، فلاحظ أن حقل TTL يجب أن يكون طابعًا زمنيًا. يتم تمكين الفهرسة في حقول TTL افتراضيًا ويمكن أن تؤثر على الأداء عند معدلات حركة المرور الأعلى. كأفضل ممارسة، قم بإضافة استثناءات حقل واحد لحقول TTL الخاصة بك.

    مجموعة كبيرة أو حقول الخريطة

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

    لمزيد من المعلومات حول كيفية حل مشكلات الفهرسة (الفهرس المتشعب، أخطاء INVALID_ARGUMENT ) راجع صفحة استكشاف الأخطاء وإصلاحها .