توضّح هذه الصفحة كيفية إدارة الفهارس. لمزيد من المعلومات حول الفهارس، يمكنك الاطّلاع على نظرة عامة على الفهارس.
قبل البدء
قبل أن تتمكّن من إنشاء فهرس في Cloud Firestore، تأكَّد من أنّك مُعيَّن لك أيّ من الأدوار التالية:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
لمنح دور، يُرجى الاطّلاع على منح دور واحد. لمزيد من المعلومات عن أدوار Cloud Firestore والأذونات المرتبطة بها، يُرجى الاطّلاع على الأدوار المُحدَّدة مسبقًا.
إذا كنت قد حدّدت أدوارًا مخصّصة، عليك منح جميع الأذونات التالية لإنشاء الفهارس:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
إنشاء فهرس
لإنشاء فهرس، أكمِل الخطوات التالية:
MongoDB API
استخدِم طريقة createIndex() لإنشاء فهرس. على سبيل المثال:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
يمكن أيضًا إنشاء الفهرس باستخدام
db.runCommand()مع فهرس واحد على الأكثر.db.runCommand({"createIndexes":"restaurant", "indexes": [{"key": {"cuisine":1}, "name": "cuisine_index"}]})
يُرجى ملاحظة القيود التالية:
- يمكنك إنشاء فهرس واحد فقط لكل طلب، ولا يمكن استخدام
db.collection.createIndexes(). - تستخدِم سجلات التدقيق لإنشاء الفهرس باستخدام واجهة MongoDB API اسم الطريقة
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - للاطّلاع على خيارات الفهرسة المتوافقة، راجِع الفهارس وسمات الفهرسة.
وحدة تحكُّم Firebase
-
في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
- اختَر قاعدة بيانات من قائمة قواعد البيانات.
- في علامة التبويب الفهارس، انقر على إنشاء فهرس.
- أدخِل معرّف مجموعة.
- أضِف مسار حقل واحدًا أو أكثر واختَر خيار فهرس لكل مسار.
- اختَر خيارًا لوجود الحقل، إما غير متفرّق أو متفرّق.
- يمكنك اختياريًا ضبط الخيار فهرس المفاتيح المتعددة.
- انقر على إنشاء.
- يظهر الفهرس الجديد في قائمة الفهارس، ويبدأ Cloud Firestore في إنشاء الفهرس. عند إنشاء الفهرس، ستظهر علامة اختيار خضراء بجانبه. إذا لم يتم إنشاء الفهرس، يمكنك الاطّلاع على أخطاء إنشاء الفهرس لمعرفة الأسباب المحتملة.
gcloud CLI
لإنشاء فهرس، استخدِم الأمر
gcloud firestore indexes composite create. اضبط api-scope على mongodb-compatible-api.
gcloud firestore indexes composite create \ --database='DATABASE_ID' \ --collection-group=COLLECTION \ --field-config=FIELD_CONFIGURATION \ --query-scope=collection-group \ --density=dense \ --api-scope=mongodb-compatible-api
استبدِل ما يلي:
- DATABASE_ID: رقم تعريف قاعدة البيانات
- COLLECTION: اسم مجموعة
- FIELD_CONFIGURATION: إعدادات الحقل لكل حقل،
أضِف
--field-config=field-path=. على سبيل المثال:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descendingلمزيد من المعلومات حول إعداد هذه الحقول، يُرجى الاطّلاع على
--field-config.
لإنشاء فهرس متفرّق، اضبط --density=sparse-any.
لإنشاء فهرس بمفاتيح متعدّدة، أضِف العلامة --multikey.
لإنشاء فهرس فريد، أضِف العلامة --unique.
Terraform
استخدِم مورد
google_firestore_index
واضبط api_scope على MONGODB_COMPATIBLE_API وquery_scope على COLLECTION_GROUP.
resource "google_firestore_index" "index" { database = "DATABASE_ID" collection = "COLLECTION" api_scope = "MONGODB_COMPATIBLE_API" query_scope = "COLLECTION_GROUP" // You can include multiple field blocks fields { field_path = "FIELD_PATH" order = "ORDER" } // Optional multikey = true density = "DENSITY" }
استبدِل ما يلي:
- DATABASE_ID: رقم تعريف قاعدة البيانات التي اخترتها
- COLLECTION: اسم المجموعة المطلوب فهرسته
- استبدِل FIELD_PATH باسم الحقل المطلوب فهرسته
- ORDER: إحدى القيمتين
ASCENDINGأوDESCENDING - DENSITY: إحدى القيمتين
SPARSE_ANYأوDENSE
إنشاء فهرس نصي
أنشئ فهرسًا نصيًا إذا كنت تريد إجراء بحث نصي عن سلاسل معيّنة ضمن مجموعة.
لإنشاء فهرس نصي للمجموعة، أكمِل الخطوات التالية:
MongoDB API
استخدِم طريقة
createIndex()
لإنشاء فهرس نصي.
في المثال التالي، عند كتابة مستند في المجموعة cities مع ملء الحقلين country أو food، يتم فهرسة هذين الحقلين لأغراض البحث.
db.cities.createIndex({"country": "text", "food": "text"})
يجب أن يكون الحقل عبارة عن سلسلة أو صفيف من السلاسل ليتم فهرسته،
ولا تتم فهرسة فهارس الصفيف، وبالتالي، ستؤدي فهرسة a.1.b إلى فهرسة
something في {a: {1: {b: something}}}، ولكن ليس في
{a: [one, {b: something}]}.
يمكنك أيضًا إنشاء فهارس باستخدام db.runCommand(). يمكنك إنشاء فهرس نصي واحد فقط لكل مجموعة، ولكن يمكنك إنشاء فهارس متعددة من أنواع مختلفة في db.runCommand() واحد. يستخدم المثال التالي db.runCommand()
لإنشاء فهرس نصي:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
تحديد لغة تلقائية
يمكنك أيضًا تحديد لغة تلقائية أو مسار حقل في المستند يتضمّن اللغة التلقائية.
في المثال التالي، تم تحديد myLanguageField
كـ language_override. عندما يحتوي مستند في المجموعة cities على حقل باسم myLanguageField، يتم استخدام قيمة هذا الحقل لتحديد اللغة التي سيتم بها فهرسة الحقل country لهذا المستند المحدّد. تلغي هذه القيمة اللغة التلقائية لـ french.
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- يمكنك إدخال اللغة إما باسمها الكامل (
english) أو باستخدام رمز اللغة المكوّن من حرفَين وفقًا لمعيار ISO (en). - في حال عدم ضبط اللغة التلقائية، سيتم ضبط Cloud Firestore تلقائيًا على اللغة الإنجليزية.
- يجب أن يكون حقل تجاهل اللغة حقل مستوى أعلى. في حال عدم ضبط الحقل، سيتم ضبطه تلقائيًا على
language. - إذا ضبطت اللغة التلقائية على الحرف
null، لن يستخدم Cloud Firestore أي حقل كبديل للغة.
توسيع لعرض قائمة باللغات المتاحة
| رمز اللغة | اسم اللغة |
|---|---|
| "und" | الرصد التلقائي |
| "af" | الأفريقانية |
| "ak" | الأكانية |
| "sq" | الألبانية |
| "am" | الأمهرية |
| "ar" | العربية |
| "hy" | الأرمينية |
| "az" | الأذربيجانية |
| "eu" | الباسكية |
| "be" | البيلاروسية |
| "bn" | البنغالية |
| "bs" | البوسنية |
| "bg" | البلغارية |
| "my" | البورمية |
| "ca" | الكتالانية |
| "ceb" | السيبيوانية |
| "chr" | الشيروكية |
| "zh" | الصينية |
| "zh-Hant" | الصينية_التقليدية |
| "hr" | الكرواتية |
| "cs" | التشيكية |
| "da" | الدانماركية |
| "nl" | الهولندية |
| "en" | الإنجليزية |
| "eo" | الإسبرانتو |
| "et" | الإستونية |
| "fil" | الفلبينية |
| "fi" | الفنلندية |
| "fr" | الفرنسية |
| "gl" | الغليشيانية |
| "ka" | الجورجية |
| "de" | الألمانية |
| "el" | اليونانية |
| "gu" | الغوجاراتية |
| "ht" | Haitian_Creole |
| "ha" | الهوسا |
| "haw" | بيتزا على طريقة هاواي |
| "iw" | العبرية |
| "مرحبًا" | الهندية |
| "hmn" | الهمونجية |
| "hu" | الهنغارية |
| "is" | الأيسلندية |
| "ig" | الإيجبو |
| "id" | الإندونيسية |
| "ga" | الأيرلندية |
| "it" | مأكولات إيطالية |
| "ja" | اليابانية |
| "jv" | الجافانية |
| "kn" | الكانادا |
| "kk" | الكازاخية |
| "كم" | الخميرية |
| "ko" | الكورية |
| "lo" | اللاوية |
| "la" | اللاتينية |
| "lv" | اللاتفية |
| "lt" | الليتوانية |
| "رطل" | اللوكسمبورغية |
| "mk" | المقدونية |
| "ملغ" | الملغاشية |
| "ms" | الماليزية |
| "مل" | المالايالامية |
| "mt" | المالطية |
| "mi" | الماورية |
| "mr" | المراثية |
| "mfe" | المورسيانية |
| "mn" | المنغولية |
| "sr-ME" | Serbian_Montenegro |
| "ne" | النيبالية |
| "no" | النرويجية |
| "ny" | النيانجا |
| "أو" | الأوديا |
| "fa" | الفارسية |
| "pl" | البولندية |
| "pt-BR" | البرتغالية_البرازيل |
| "pt-PT" | البرتغالية_البرتغال |
| "pa" | بنجابي |
| "ro" | الرومانية |
| "ru" | الروسية |
| "gd" | الغيلية الاسكتلندية |
| "sr" | الصربية |
| "st" | السوتو الجنوبية |
| "si" | السنهالية |
| "sk" | السلوفاكية |
| "sl" | السلوفينية |
| "so" | الصومالية |
| "es" | الإسبانية |
| "su" | السندانية |
| "sw" | السواحيلية |
| "sv" | السويدية |
| "tg" | الطاجيكية |
| "ta" | التاميلية |
| "te" | التيلوغوية |
| "th" | التايلاندية |
| "tr" | التركية |
| "uk" | الأوكرانية |
| "ur" | الأوردية |
| "uz" | الأوزبكية |
| "vi" | الفيتنامية |
| "cy" | الويلزية |
| "yi" | اليديشية |
| yo" | اليوروبا |
| "zu" | الزولو |
تقسيم فهرس نصي
يمكنك أيضًا تقسيم الفهرس باستخدام حقل لتتمكّن من فلترة طلبات البحث حسب قيمة حقل معيّنة. تتيح لك هذه الإعدادات التنفيذ السريع للاستعلامات إذا كنت بحاجة دائمًا إلى فلترة حقل معيّن في الفهرس الذي تستعلم عنه.
لإنشاء فهرس مع قسم، اضبط حقل firestoreOptions على النحو التالي:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
المكان:
PARTITIONED_FIELDهو اسم الحقل المستخدَم في التقسيم، ويجب أن تكون هذه القيمة سلسلة ويجب أن تشير إلى حقل من المستوى الأعلى. عند تنفيذ طلب بحث على فهرس مقسَّم، يمكنك فلترة النتائج استنادًا إلى قيمة هذا الحقل. على سبيل المثال، يمكنك تقسيم الفهرس باستخدامcity. إذا تم تحديد حقلcityفي فهرس النص، يمكن للمستخدمين البحث عن مدينة معيّنة.يجب أن يكون القسم حقلاً واحدًا فقط. إذا قسّمت فهرسًا، يمكنك تنفيذ الاستعلامات التي تم فيها تحديد الحقل المقسّم فقط.
القيود
- يمكنك إنشاء فهرس واحد فقط لكل طلب.
- تستخدم سجلّات التدقيق لإنشاء الفهرس باستخدام واجهة برمجة التطبيقات MongoDB اسم الطريقة
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - للاطّلاع على خيارات الفهرس المتوافقة، يُرجى الرجوع إلى الفهارس وخصائص الفهرس.
وحدة تحكُّم Firebase
في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
اختَر قاعدة بيانات من قائمة قواعد البيانات.
في علامة التبويب الفهارس، انقر على إنشاء فهرس.
أدخِل معرّف مجموعة.
أضِف مسار حقل واحدًا أو أكثر واختَر خيار فهرس لكل مسار.
انقر على إنشاء.
يظهر الفهرس الجديد في قائمة الفهارس، وتبدأ العمليات المتوافقة مع MongoDB في إنشاء الفهرس. وعند اكتمال إنشاء الفهرس، ستظهر علامة اختيار خضراء بجانبه. وإذا لم يتم إنشاء الفهرس، يمكنك الاطّلاع على أخطاء إنشاء الفهرس لمعرفة الأسباب المحتملة.
إنشاء فهرس 2dsphere
أنشئ فهرس 2dsphere لتنفيذ طلبات بحث جغرافية مكانية والبحث عن المستندات التي تقع ضمن نطاق معيّن من خط طول وعرض محدّدَين.
لإنشاء فهرس 2dsphere لمجموعتك، أكمِل الخطوات التالية:
MongoDB API
استخدِم طريقة
createIndex()
لإنشاء فهرس. على سبيل المثال:
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
يتيح db.runCommand() أيضًا إنشاء الفهرس مع فهرس واحد على الأكثر:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
تقسيم فهرس 2dsphere
يمكنك أيضًا تقسيم الفهرس باستخدام حقل لتتمكّن من فلترة طلبات البحث حسب قيمة حقل معيّنة. تتيح لك هذه الإعدادات التنفيذ السريع للاستعلامات إذا كنت بحاجة دائمًا إلى فلترة حقل معيّن في الفهرس الذي تستعلم عنه.
لإنشاء فهرس مع قسم، اضبط حقل firestoreOptions على النحو التالي:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
المكان:
PARTITIONED_FIELDهو اسم الحقل المستخدَم في التقسيم. عند تنفيذ طلب بحث على فهرس مقسَّم، يمكنك فلترة النتائج استنادًا إلى قيمة هذا الحقل. على سبيل المثال، إذا كان الفهرس يتضمّن الحقلregionالخاص بالمواقع الجغرافية الإقليمية، يمكنك تقسيم الفهرس باستخدامregionليتمكّن المستخدمون من البحث عن المطاعم في منطقتهم.إذا قسّمت فهرسًا، يمكنك فقط تنفيذ طلبات البحث التي تم فيها تحديد الحقل المقسّم.
القيود
- يمكنك إنشاء فهرس واحد فقط لكل طلب.
- تستخدم سجلّات التدقيق لإنشاء الفهرس باستخدام واجهة برمجة التطبيقات MongoDB اسم الطريقة
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - للاطّلاع على خيارات الفهرس المتوافقة، يُرجى الرجوع إلى الفهارس وخصائص الفهرس.
وحدة تحكُّم Firebase
في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
اختَر قاعدة بيانات من قائمة قواعد البيانات.
في علامة التبويب الفهارس، انقر على إنشاء فهرس.
أدخِل معرّف مجموعة.
أضِف مسار حقل واحدًا أو أكثر واختَر خيار فهرس لكل مسار.
انقر على إنشاء.
يظهر الفهرس الجديد في قائمة الفهارس، وتبدأ العمليات المتوافقة مع MongoDB في إنشاء الفهرس. وعند اكتمال إنشاء الفهرس، ستظهر علامة اختيار خضراء بجانبه. وإذا لم يتم إنشاء الفهرس، يمكنك الاطّلاع على أخطاء إنشاء الفهرس لمعرفة الأسباب المحتملة.
حذف فهرس
لحذف فهرس، أكمِل الخطوات التالية:
MongoDB API
استخدِم طريقة dropIndex() لحذف فهرس. على سبيل المثال:
حذف فهرس باستخدام اسم الفهرس
db.restaurants.dropIndex("cuisine_index")
حذف فهرس باستخدام تعريف الفهرس
db.restaurants.dropIndex({"cuisine" : 1})
وحدة تحكُّم Firebase
-
في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
- اختَر قاعدة بيانات من قائمة قواعد البيانات.
- انقر على علامة التبويب الفهارس.
- في قائمة الفهارس، انقر على حذف من زر المزيد للفهرس الذي تريد حذفه.
- انقر على حذف الفهرس.
gcloud CLI
للعثور على اسم الفهرس، استخدِم الأمر
gcloud firestore indexes composite list.gcloud firestore indexes composite list \ --database='DATABASE_ID'
استبدِل DATABASE_ID بمعرّف قاعدة البيانات.
-
لحذف الفهرس، استخدِم الأمر
gcloud firestore indexes composite delete.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
استبدِل ما يلي:
- INDEX_NAME: اسم مؤشر
- DATABASE_ID: رقم تعريف قاعدة البيانات
مدة تصميم الفهرس
لإنشاء فهرس، يجب أن ينشئ Cloud Firestore الفهرس ثم يعيد ملء إدخالات الفهرس بالبيانات الحالية. يتم تحديد الوقت المطلوب لإنشاء فهرس من خلال ما يلي:
الحدّ الأدنى لمدّة تصميم الفهرس هو بضع دقائق، حتى بالنسبة إلى قاعدة بيانات فارغة.
يعتمد الوقت المطلوب لإعادة ملء إدخالات الفهرس على مقدار البيانات الحالية التي تنتمي إلى الفهرس الجديد. وكلما زاد عدد قيم الحقول التي تتطابق مع تعريف الفهرس، زاد الوقت المطلوب لإعادة ملء إدخالات الفهرس.
إدارة العمليات الطويلة الأمد
عمليات إنشاء الفهارس هي عمليات تستغرق وقتًا طويلاً، وتوضّح الأقسام التالية كيفية التعامل مع العمليات التي تستغرق وقتًا طويلاً لإنشاء الفهارس.
بعد بدء إنشاء فهرس، يحدّد Cloud Firestore اسمًا فريدًا للعملية، ويتم إضافة البادئة projects/PROJECT_ID/databases/DATABASE_ID/operations/ إلى أسماء العمليات، على سبيل المثال:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
يمكنك حذف البادئة عند تحديد اسم عملية للأمر describe.
إدراج جميع العمليات التي تستغرق وقتًا طويلاً
لعرض العمليات الطويلة الأمد، استخدِم الأمر
gcloud firestore operations list، الذي يعرض العمليات الجارية والمكتملة مؤخرًا،
وتبقى العمليات مُدرَجة لبضعة أيام بعد اكتمالها:
gcloud firestore operations list
التحقّق من حالة العملية
بدلاً من إدراج جميع العمليات التي تستغرق وقتًا طويلاً، يمكنك إدراج تفاصيل عملية واحدة:
gcloud firestore operations describe operation-name
تقدير وقت الإكمال
أثناء تنفيذ العملية، اطّلِع على قيمة الحقل state لمعرفة الحالة العامة للعملية.
يعرض طلب معرفة حالة عملية طويلة الأمد المقياسَين
workEstimated وworkCompleted. تعرض workEstimated إجمالي عدد المستندات المقدَّر التي ستتم معالجتها في عملية واحدة. تعرض workCompleted
عدد المستندات التي تمت معالجتها حتى الآن. بعد اكتمال العملية،
تعكس workCompleted إجمالي عدد المستندات التي تمت معالجتها فعليًا،
والذي قد يختلف عن قيمة workEstimated.
لتقدير مدى تقدّم عملية ما، قسِّم workCompleted على workEstimated.
في ما يلي مثال على مدى تقدّم عملية إنشاء فهرس:
{
"operations": [
{
"name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
"metadata": {
"@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
"common": {
"operationType": "CREATE_INDEX",
"startTime": "2020-06-23T16:52:25.697539Z",
"state": "PROCESSING"
},
"progressDocuments": {
"workCompleted": "219327",
"workEstimated": "2198182"
}
},
},
...
عند اكتمال عملية، سيتضمّن وصف العملية "done": true. اطّلِع على قيمة الحقل state لمعرفة نتيجة العملية. إذا لم يتم ضبط الحقل done في الرد، يعني ذلك أنّ العملية لم تكتمل.