إدارة الفهارس

توضّح هذه الصفحة كيفية إدارة الفهارس. لمزيد من المعلومات حول الفهارس، يمكنك الاطّلاع على نظرة عامة على الفهارس.

قبل البدء

قبل أن تتمكّن من إنشاء فهرس في Cloud Firestore، تأكَّد من أنّك مُعيَّن لك أيّ من الأدوار التالية:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

لمنح دور، يُرجى الاطّلاع على منح دور واحد. لمزيد من المعلومات عن أدوار Cloud Firestore والأذونات المرتبطة بها، يُرجى الاطّلاع على الأدوار المُحدَّدة مسبقًا.

إذا كنت قد حدّدت أدوارًا مخصّصة، عليك منح جميع الأذونات التالية لإنشاء الفهارس:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

إنشاء فهرس

لإنشاء فهرس، أكمِل الخطوات التالية:

MongoDB API

استخدِم طريقة createIndex() لإنشاء فهرس. على سبيل المثال:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • يمكن أيضًا إنشاء الفهرس باستخدام db.runCommand() مع فهرس واحد على الأكثر.

      db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
      

يُرجى ملاحظة القيود التالية:

  • يمكنك إنشاء فهرس واحد فقط لكل طلب. ‫db.collection.createIndexes() غير متاح.
  • تستخدِم سجلات التدقيق لإنشاء الفهرس باستخدام MongoDB API اسم الطريقة google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • للاطّلاع على خيارات الفهرسة المتوافقة، راجِع الفهارس وسمات الفهرسة.
Firebase وحدة التحكّم
  1. في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.

    الانتقال إلى "قاعدة بيانات Firestore"

  2. اختَر قاعدة بيانات من قائمة قواعد البيانات.
  3. في علامة التبويب الفهارس، انقر على إنشاء فهرس.
  4. أدخِل معرّف مجموعة.
  5. أضِف مسار حقل واحدًا أو أكثر واختَر خيار فهرس لكل مسار.
  6. اختَر خيارًا لوجود الحقل، إما غير متفرّق أو متفرّق.
  7. يمكنك اختياريًا ضبط الخيار فهرس المفاتيح المتعددة.
  8. انقر على إنشاء.
  9. يتم عرض الفهرس الجديد في قائمة الفهارس، ويبدأ 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" الليتوانية
"lb" اللوكسمبورغية
"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 وحدة التحكّم

  1. في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.

    الانتقال إلى "قاعدة بيانات Firestore"

  2. اختَر قاعدة بيانات من قائمة قواعد البيانات.

  3. في علامة التبويب الفهارس، انقر على إنشاء فهرس.

  4. أدخِل معرّف مجموعة.

  5. أضِف مسار حقل واحدًا أو أكثر واختَر خيار فهرس لكل مسار.

  6. انقر على إنشاء.

  7. يتم عرض الفهرس الجديد في قائمة الفهارس، وتبدأ العمليات المتوافقة مع 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 وحدة التحكّم

  1. في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.

    الانتقال إلى "قاعدة بيانات Firestore"

  2. اختَر قاعدة بيانات من قائمة قواعد البيانات.

  3. في علامة التبويب الفهارس، انقر على إنشاء فهرس.

  4. أدخِل معرّف مجموعة.

  5. أضِف مسار حقل واحدًا أو أكثر واختَر خيار فهرس لكل مسار.

  6. انقر على إنشاء.

  7. يتم عرض الفهرس الجديد في قائمة الفهارس، وتبدأ العمليات المتوافقة مع MongoDB في إنشاء الفهرس. عند إنشاء الفهرس، ستظهر علامة اختيار خضراء بجانبه. إذا لم يتم إنشاء الفهرس، يُرجى الاطّلاع على أخطاء إنشاء الفهرس لمعرفة الأسباب المحتملة.

حذف فهرس

لحذف فهرس، أكمِل الخطوات التالية:

MongoDB API

استخدِم طريقة dropIndex() لحذف فهرس. على سبيل المثال:

حذف فهرس باستخدام اسم الفهرس

db.restaurants.dropIndex("cuisine_index")

حذف فهرس باستخدام تعريف الفهرس

db.restaurants.dropIndex({"cuisine" : 1})
Firebase وحدة التحكّم
  1. في وحدة تحكّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.

    الانتقال إلى "قاعدة بيانات Firestore"

  2. اختَر قاعدة بيانات من قائمة قواعد البيانات.
  3. انقر على علامة التبويب الفهارس.
  4. في قائمة الفهارس، انقر على حذف من زر المزيد للفهرس الذي تريد حذفه.
  5. انقر على حذف الفهرس.
gcloud CLI
  1. للعثور على اسم الفهرس، استخدِم الأمر gcloud firestore indexes composite list.

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    استبدِل DATABASE_ID بمعرّف قاعدة البيانات.

  2. لحذف الفهرس، استخدِم الأمر 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 في الرد، يعني ذلك أنّ العملية لم تكتمل.