این صفحه نحوه مدیریت ایندکسها را شرح میدهد. برای کسب اطلاعات بیشتر در مورد ایندکسها، به نمای کلی ایندکسها مراجعه کنید.
قبل از اینکه شروع کنی
قبل از اینکه بتوانید در 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
ایجاد یک فهرست
برای ایجاد یک شاخص، مراحل زیر را انجام دهید:
رابط برنامهنویسی کاربردی مونگودیبی
برای ایجاد یک اندیس از متد 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 از متدی با نام
google.firestore.admin.v1.FirestoreAdmin.CreateIndexاستفاده میکنند. - برای گزینههای پشتیبانیشده برای اندیسها، به اندیسها و ویژگیهای اندیس مراجعه کنید.
کنسول Firebase
در کنسول Firebase ، به صفحه پایگاه داده فایراستور بروید.
- یک پایگاه داده از لیست پایگاههای داده انتخاب کنید.
- در تب Indexes ، روی Create Index کلیک کنید.
- شناسه مجموعه را وارد کنید.
- یک یا چند مسیر فیلد اضافه کنید و برای هر کدام یک گزینه شاخص انتخاب کنید.
- یک گزینه حضور میدانی، چه غیر پراکنده و چه پراکنده، انتخاب کنید.
- به صورت اختیاری، میتوانید گزینه شاخص چندکلید را تنظیم کنید.
- روی ایجاد کلیک کنید.
- ایندکس جدید شما در لیست ایندکسها نمایش داده میشود و 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 را اضافه کنید.
ترافرم
از منبع 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
ایجاد فهرست متن
اگر میخواهید جستجوی متنی برای رشتههای خاص در یک مجموعه انجام دهید، یک فهرست متنی ایجاد کنید.
برای ایجاد یک فهرست متنی برای مجموعه خود، مراحل زیر را انجام دهید:
رابط برنامهنویسی کاربردی مونگودیبی
از متد 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 از هیچ فیلدی به عنوان لغو زبان استفاده نمیکند.
برای مشاهده لیست زبانهای پشتیبانی شده، گسترش دهید
| کد زبان | نام زبان |
|---|---|
| "و" | تشخیص خودکار |
| "اف" | آفریکانس |
| "آک" | آکان |
| "مربع" | آلبانیایی |
| "هستم" | امهری |
| "آر" | عربی |
| "های" | ارمنی |
| "آز" | آذربایجانی |
| "یو" | باسک |
| «باش» | بلاروسی |
| "بن" | بنگلا |
| "بی اس" | بوسنیایی |
| "بی جی" | بلغاری |
| "من" | برمهای |
| "کا" | کاتالان |
| "سیب" | سبوانو |
| "سی اچ آر" | چروکی |
| "ژ" | چینی |
| "ژ-هانت" | چینی_سنتی |
| "ساعت" | کرواتی |
| "سی اس" | چک |
| «دا» | دانمارکی |
| "ان ال" | هلندی |
| «ان» | انگلیسی |
| "ایو" | اسپرانتو |
| "و" | استونیایی |
| "فیل" | فیلیپینی |
| «فی» | فنلاندی |
| "از" | فرانسوی |
| "گل" | گالیسیایی |
| «کا» | گرجی |
| "دی" | آلمانی |
| «ال» | یونانی |
| "گو" | گجراتی |
| «هت» | هائیتی_کریول |
| «ها» | هوسا |
| "ها" | هاوایی |
| "آی دبلیو" | عبری |
| «سلام» | هندی |
| «همن» | همونگ |
| «هو» | مجارستانی |
| "هست" | ایسلندی |
| "آی جی" | ایگبو |
| «شناسه» | اندونزیایی |
| "گا" | ایرلندی |
| «آن» | ایتالیایی |
| «جا» | ژاپنی |
| "جی وی" | جاوه ای |
| "کن" | کانارا |
| «ک ک» | قزاق |
| "کیلومتر" | خمر |
| "کو" | کره ای |
| «لو» | لائو |
| «لا» | لاتین |
| "ال وی" | لتونیایی |
| "آن" | لیتوانیایی |
| "پوند" | لوکزامبورگی |
| «ام کی» | مقدونی |
| "میلی گرم" | مالاگاسیایی |
| "اماس" | مالایی |
| "میلی لیتر" | مالایالامی |
| "کوه" | مالتی |
| "من" | مائوری |
| «آقا» | مراتی |
| "ام اف ای" | موریسین |
| "م.ن" | مغولی |
| «اسآر-امای» | صربستان_مونتهنگرو |
| "نه" | نپالی |
| «نه» | نروژی |
| "نی" | نیانیا |
| «یا» | اودیا |
| «فا» | فارسی |
| "پل" | لهستانی |
| "pt-BR" | پرتغالی_برزیل |
| "پی تی-پی تی" | پرتغالی_پرتغال |
| "پا" | پنجابی |
| "رو" | رومانیایی |
| "رو" | روسی |
| "جی دی" | گالیک اسکاتلندی |
| «س» | صربی |
| "خیابان" | سوتوی جنوبی |
| «سی» | سینهالی |
| "اس کی" | اسلواکی |
| "اس ال" | اسلوونیایی |
| "بنابراین" | سومالیایی |
| "ها" | اسپانیایی |
| "سو" | سوندایی |
| "اس دبلیو" | سواحیلی |
| "اس وی" | سوئدی |
| "تی جی" | تاجیک |
| «تا» | تامیل |
| "ته" | تلوگو |
| "ث" | تایلندی |
| "تر" | ترکی |
| "بریتانیا" | اوکراینی |
| "تو" | اردو |
| "اوز" | ازبکی |
| «وی» | ویتنامی |
| "سی" | ولزی |
| «یی» | ییدیش |
| «یو» | یوروبا |
| "زو" | زولو |
پارتیشن بندی یک فهرست متنی
همچنین میتوانید اندیس خود را با استفاده از یک فیلد تقسیمبندی کنید تا بتوانید پرسوجوها را بر اساس مقدار یک فیلد خاص فیلتر کنید. این پیکربندی به شما امکان میدهد در صورتی که همیشه به یک فیلد خاص فیلتر شده در اندیس مورد نظر خود نیاز دارید، پرسوجوهای کارآمدتری را اجرا کنید.
برای ایجاد یک فهرست با یک پارتیشن، فیلد 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 بروید.
یک پایگاه داده از لیست پایگاههای داده انتخاب کنید.
در تب Indexes ، روی Create Index کلیک کنید.
شناسه مجموعه را وارد کنید.
یک یا چند مسیر فیلد اضافه کنید و برای هر کدام یک گزینه شاخص انتخاب کنید.
روی ایجاد کلیک کنید.
ایندکس جدید شما در لیست ایندکسها نمایش داده میشود و عملیات سازگار با MongoDB شروع به ایجاد ایندکس شما میکند. وقتی ایندکس شما ایجاد شد، یک علامت تیک سبز در کنار ایندکس مشاهده خواهید کرد. اگر ایندکس ایجاد نشد، برای دلایل احتمالی به خطاهای ساخت ایندکس مراجعه کنید.
ایجاد یک اندیس 2dsphere
یک فهرست 2dsphere ایجاد کنید تا بتوانید پرسوجوهای مکانی انجام دهید و اسنادی را که در یک محدوده خاص از طول و عرض جغرافیایی مشخص وجود دارند، جستجو کنید.
برای ایجاد یک فهرست 2dsphere برای مجموعه خود، مراحل زیر را انجام دهید:
رابط برنامهنویسی کاربردی مونگودیبی
برای ایجاد یک اندیس از متد 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 بروید.
یک پایگاه داده از لیست پایگاههای داده انتخاب کنید.
در تب Indexes ، روی Create Index کلیک کنید.
شناسه مجموعه را وارد کنید.
یک یا چند مسیر فیلد اضافه کنید و برای هر کدام یک گزینه شاخص انتخاب کنید.
روی ایجاد کلیک کنید.
ایندکس جدید شما در لیست ایندکسها نمایش داده میشود و عملیات سازگار با MongoDB شروع به ایجاد ایندکس شما میکند. وقتی ایندکس شما ایجاد شد، یک علامت تیک سبز در کنار ایندکس مشاهده خواهید کرد. اگر ایندکس ایجاد نشد، برای دلایل احتمالی به خطاهای ساخت ایندکس مراجعه کنید.
حذف یک ایندکس
برای حذف یک ایندکس، مراحل زیر را انجام دهید:
رابط برنامهنویسی کاربردی مونگودیبی
برای حذف یک اندیس از متد dropIndex() استفاده کنید. برای مثال:
حذف یک اندیس با استفاده از نام اندیس
db.restaurants.dropIndex("cuisine_index")
حذف یک اندیس با استفاده از تعریف اندیس
db.restaurants.dropIndex({"cuisine" : 1})
کنسول Firebase
در کنسول Firebase ، به صفحه پایگاه داده فایراستور بروید.
- یک پایگاه داده از لیست پایگاههای داده انتخاب کنید.
- روی برگه Indexes کلیک کنید.
- در لیست ایندکسها، از دکمهی More گزینهی Delete را برای ایندکسی که میخواهید حذف کنید، انتخاب کنید.
- روی حذف فهرست کلیک کنید.
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 در پاسخ تنظیم نشده باشد، عملیات تکمیل نشده است.