توضّح هذه الصفحة عملية الفهرسة في Cloud Firestore. لا تنشئ Cloud Firestore أي فهارس تلقائيًا. لتحسين أداء قاعدة البيانات، أنشئ فهارس لطلبات البحث الأكثر استخدامًا.
تؤثر الفهارس بشكل كبير في أداء قاعدة البيانات. إذا كان هناك فهرس لطلب بحث، يمكن لقاعدة البيانات عرض النتائج بكفاءة من خلال تقليل كمية البيانات التي يجب فحصها وتقليل العمل اللازم لترتيب النتائج. ومع ذلك، تزيد إدخالات الفهرس من تكاليف التخزين ومقدار العمل الذي يتم إجراؤه أثناء عملية الكتابة في الحقول المفهرسة.
تعريف الفهرس وبنيته
يتألف الفهرس مما يلي:
- معرّف مجموعة
- قائمة بالحقول في المجموعة المحدّدة
- ترتيب، إما تصاعديًا أو تنازليًا، لكل حقل
يمكن أن يتيح الفهرس أيضًا خيارات sparse أو multikey أو unique.
ترتيب الفهرس
يحدّد ترتيب كل حقل واتجاه الفرز فيه الفهرس بشكل فريد. على سبيل المثال، الفهرسان التاليان هما فهرسان مختلفان ولا يمكن التبديل بينهما:
| التجميع | الحقول |
|---|---|
| المدن | البلد (تصاعديًا)، عدد السكان (تنازليًا) |
| المدن | عدد السكان (تنازليًا)، البلد (تصاعديًا)، |
عند إنشاء فهرس لدعم طلب بحث، يجب تضمين الحقول بالترتيب نفسه الذي يظهر في طلب البحث.
كثافة الفهرس
تخزّن إدخالات الفهرس تلقائيًا البيانات من جميع المستندات في مجموعة. يُعرف هذا باسم الفهرس غير المتناثر. ستتم إضافة إدخال فهرس لمستند بغض النظر عما إذا كان المستند يحتوي على أي من الحقول المحددة في الفهرس. يتم التعامل مع الحقول غير الموجودة على أنّها تحتوي على قيمة فارغة عند إنشاء إدخالات الفهرس. لتغيير هذا السلوك، يمكنك تحديد الفهرس كفهرس متناثر.
الفهارس المتفرّقة
يفهرس الفهرس المتناثر المستندات في المجموعة التي تحتوي على قيمة (بما في ذلك القيمة الفارغة) لحقل واحد على الأقل من الحقول المفهرسة. يقلّل الفهرس المتناثر من تكاليف التخزين ويمكن أن يحسّن الأداء.
فهارس متعددة المفاتيح لقيم الصفائف
إذا كنت تنشئ فهرسًا في حقل يحتوي على قيم مصفوفة، فيجب عليك إنشاء فهرس متعدد المفاتيح. لا يمكن للفهرس العادي فهرسة قيم المصفوفات. يتيح الفهرس المتعدد المفاتيح استخدام حقل مصفوفة واحد كحد أقصى في تعريف الفهرس، ويمكن استخدامه للعمليات التي تتنقّل بين قيم المصفوفة.
لا تستخدِم الفهارس المتعددة المفاتيح إلا إذا كنت بحاجة إلى فهرسة قيم المصفوفات. تتوفّر للفهارس العادية مزايا عند معالجة طلب بحث. على سبيل المثال، يمكن للفهارس العادية فلترة القيم ضمن نطاق معيّن بكفاءة أكبر.
تؤدي الحالات التالية إلى حدوث أخطاء عند العمل مع قيم المصفوفات وفهارس المفاتيح المتعددة:
- تحاول إحدى العمليات إضافة قيمة مصفوفة إلى حقل مفهرَس بواسطة فهرس عادي. لإضافة قيمة المصفوفة، يجب حذف الفهارس العادية الحالية في هذا الحقل، وإعادة إنشائها كفهارس متعددة المفاتيح.
- تحاول إنشاء فهرس عادي في حقل يحتوي على قيمة مصفوفة. يجب إنشاء فهرس متعدد المفاتيح أو حذف قيم الصفائف.
- تحاول إحدى العمليات فهرسة حقول متعددة باستخدام قيم مصفوفة. لا يمكنك استخدام أكثر من حقل واحد بقيمة مصفوفة في فهرس متعدد المفاتيح. للمتابعة، عليك تعديل نموذج البيانات أو تعريفات الفهرس.
- تحاول إنشاء فهرس متعدد المفاتيح حيث يشترك مساران للحقول في بادئة مشتركة مثل
users.postsوusers.zip.
الفهارس الفريدة
اضبط خيار الفهرس الفريد لفرض قيم فريدة للحقول المفهرسة. بالنسبة إلى الفهارس التي تتضمّن حقولاً متعددة، يجب أن تكون كل مجموعة من القيم فريدة في الفهرس. ترفض قاعدة البيانات أي عمليات تحديث وإدراج تحاول إنشاء إدخالات فهرس بقيم مكررة. إذا كانت بيانات الحقول المفهرَسة تحتوي على قيم مكرّرة وحاولت إنشاء فهرس فريد، سيتعذّر إنشاء الفهرس وستظهر رسالة خطأ في تفاصيل العملية.
الحقول غير المتوفّرة في فهرس فريد
إذا أدخلت مستندًا يحتوي على حقول غير متوفّرة للفهرس الفريد، يضبط الفهرس قيم null للحقول غير المتوفّرة. يجب أن يكون إدخال الفهرس الناتج
فريدًا وإلا ستفشل العملية.
على سبيل المثال، باستخدام هذا الفهرس:
db.cities.createIndex( { "name": 1 }, { unique: true } )
إذا أضفت المستند {"abbreviation": "LA"} إلى المجموعة، سينشئ الفهرس الفريد إدخالاً مع ضبط name على null. إذا حاولت بعد ذلك إضافة المستند {"abbreviation": "NYC"}، ستفشل العملية لأنّ الإدخال الناتج للفهرس الفريد هو نفسه.
ينطبق السلوك نفسه على الفهارس الفريدة التي تحتوي على حقول متعددة.
When creating or updating a document, missing
indexed fields are set to null and the resulting index entry must be
unique in the index.
الفهارس الفريدة في قيم الصفائف
يمكن استخدام فهرس فريد متعدد المفاتيح لفرض عدم احتواء المستندات على عناصر مصفوفة متداخلة.
هذا النوع من الفهارس لا يفرض أن يحتوي الصفيف على قيم فريدة ضمن مستند واحد.
على سبيل المثال، باستخدام فهرس فريد:
db.collection.createIndex( { "tags": 1 }, { unique: true } )
المستند التالي صالح للإدراج:
{
"_id": 1,
"tags": [ "news", "tech", "news", "music" ]
}
يسمح الفهرس بالقيم المكرّرة ("news") ضمن الصفيفة نفسها في مستند واحد.
إذا حاولت إدراج مستند ثانٍ يحتوي على عنصر مكرر، فستفشل العملية:
{
"_id": 2,
"tags": [ "sports", "music" ]
}
تفشل العملية لأنّ "music" متوفّر في مصفوفة المستند 1 وتم ربطه في الفهرس.
إذا أردت التأكّد من أنّ العناصر ضمن الصفيف نفسه في مستند واحد
فريدة، يمكنك معالجة ذلك في منطق التطبيق باستخدام عوامل تعديل
مثل $addToSet بدلاً من $push.
المصفوفات الفارغة والحقول غير المتوفّرة والقيم الفارغة
عادةً ما يتم التعامل مع الحقول غير المتوفّرة في فهرس فريد على أنّها null ويجب أن تكون فريدة في جميع المستندات (يُرجى الاطّلاع على الحقول غير المتوفّرة في فهرس فريد).
ومع ذلك، بالنسبة إلى الفهارس الفريدة في حقول الصفائف:
- المصفوفات الفارغة والحقول غير المتوفّرة والقيم الفارغة المستقلة: إذا كان حقل المصفوفة فارغًا أو غير متوفّر بالكامل أو يحتوي على قيمة
nullمستقلة (ليست داخل مصفوفة)، لن يتم إنشاء مفاتيح فهرسة للمستند. لذلك، يمكن أن تحتوي مستندات متعددة على حقول فارغة أو قيمnullمستقلة بدون ظهور أخطاء المفاتيح المكرّرة. - عناصر فارغة داخل مصفوفة: إذا كانت المصفوفة تحتوي على قيمة
nullكعنصر (على سبيل المثال،["news", null])، تتم فهرسة العنصرnull. أي مستند لاحق يحتوي على عنصرnullفي حقل المصفوفة المفهرسة سيتعذّر إرساله مع ظهور خطأ مفتاح مكرر.
فهارس TTL
استخدِم فهارس TTL لإزالة البيانات القديمة تلقائيًا من قواعد البيانات. يحدّد فهرس TTL حقلاً معيّنًا على أنّه وقت انتهاء صلاحية المستندات في مجموعة معيّنة. باستخدام TTL، يمكنك خفض تكاليف التخزين عن طريق تنظيف البيانات القديمة. يتم عادةً حذف البيانات خلال 24 ساعة من وقت انتهاء صلاحيتها.
تحديد مشاكل أخطاء إنشاء الفهرس وحلّها
قد تظهر لك أخطاء في إنشاء الفهارس عند إدارتها. يمكن أن تفشل عملية الفهرسة إذا واجهت قاعدة البيانات مشكلة في البيانات. يمكن أن تفشل عمليات الفهرسة للأسباب التالية:
- لقد بلغت الحدّ الأقصى المسموح به للفهرسة. على سبيل المثال، قد تكون العملية قد وصلت إلى الحد الأقصى لعدد إدخالات الفهرس لكل مستند. إذا تعذّر إنشاء الفهرس، ستظهر لك رسالة خطأ. إذا لم تبلغ الحدّ الأقصى للفهرسة، أعِد محاولة إجراء الفهرسة.
- يجب استخدام فهرس متعدد المفاتيح. يحتوي حقل واحد على الأقل من الحقول المفهرَسة على قيمة مصفوفة. للمتابعة، عليك استخدام فهرس متعدد المفاتيح أو حذف قيم الصفيف.
- تحاول إحدى العمليات فهرسة حقول متعددة باستخدام قيم مصفوفة. لا يمكنك استخدام أكثر من حقل واحد بقيمة مصفوفة في فهرس متعدد المفاتيح. للمتابعة، عليك تعديل نموذج البيانات أو تعريفات الفهرس.
- لقد ضبطت خيار الفهرس الفريد، وستؤدي بيانات الحقول المفهرَسة إلى إنشاء إدخالات فهرس مكرّرة. للمتابعة، عليك إزالة المجموعات المكرّرة من القيم من البيانات.