شاخصها عامل مهمی در عملکرد یک پایگاه داده هستند. دقیقاً مانند شاخص یک کتاب که موضوعات یک کتاب را به شماره صفحات نگاشت میکند، یک شاخص پایگاه داده، موارد موجود در یک پایگاه داده را به مکانهای آنها در پایگاه داده نگاشت میکند. هنگامی که شما از یک پایگاه داده پرس و جو میکنید، پایگاه داده میتواند از یک شاخص برای شناسایی سریع مکانهای موارد درخواستی شما استفاده کند.
این صفحه دو نوع شاخصی را که 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 یک پیام خطا به همراه لینکی که میتوانید برای ایجاد ایندکس گمشده دنبال کنید، برمیگرداند.
همچنین میتوانید با استفاده از کنسول یا با استفاده از Firebase CLI ، شاخصهای مرکب را به صورت دستی تعریف و مدیریت کنید. برای اطلاعات بیشتر در مورد ایجاد و مدیریت شاخصهای مرکب، به مدیریت شاخصها مراجعه کنید.
حالتهای فهرستبندی و دامنههای پرسوجو
شما ایندکسهای تک فیلدی و ترکیبی را به طور متفاوتی پیکربندی میکنید، اما هر دو نیاز دارند که حالتهای ایندکس و دامنههای پرسوجو را برای ایندکسهای خود پیکربندی کنید.
حالتهای فهرست
وقتی یک شاخص تعریف میکنید، برای هر فیلد شاخصگذاری شده، یک حالت شاخصگذاری انتخاب میکنید. حالت شاخصگذاری هر فیلد، از عبارات پرسوجوی خاصی در آن فیلد پشتیبانی میکند. میتوانید از بین حالتهای شاخصگذاری زیر انتخاب کنید:
| حالت فهرست | توضیحات |
|---|---|
| صعودی_به_سمت_بالا | از عبارات کوئری < ، <= ، == ، >= ، > != ، in و not-in در فیلد پشتیبانی میکند و از مرتبسازی نتایج به ترتیب صعودی بر اساس مقدار این فیلد پشتیبانی میکند. |
| نزولی_بهسمت پایین | از عبارات پرسوجوی < ، <= ، == ، >= ، > != ، in و not-in در فیلد پشتیبانی میکند و از مرتبسازی نتایج به ترتیب نزولی بر اساس مقدار این فیلد پشتیبانی میکند. |
| آرایه شامل | از عبارات پرسوجوی array-contains و array-contains-any در فیلد پشتیبانی میکند. |
| بردار | از عبارتهای کوئری FindNearest در فیلد پشتیبانی میکند. |
دامنههای پرسوجو
هر ایندکس به یک مجموعه یا یک گروه از مجموعهها محدود میشود. این به عنوان محدوده پرسوجوی ایندکس شناخته میشود:
- دامنه مجموعه
- Cloud Firestore به طور پیشفرض ایندکسهایی با دامنه مجموعه ایجاد میکند. این ایندکسها از کوئریهایی پشتیبانی میکنند که نتایج را از یک مجموعه واحد برمیگردانند.
- محدوده گروه مجموعه
- یک گروه مجموعه شامل تمام مجموعههایی با شناسه مجموعه یکسان است. برای اجرای یک پرسوجوی گروه مجموعه که نتایج فیلتر شده یا مرتب شده را از یک گروه مجموعه برمیگرداند، باید یک فهرست مربوطه با دامنه گروه مجموعه ایجاد کنید.
ترتیب پیشفرض و فیلد __name__
علاوه بر مرتبسازی اسناد بر اساس حالتهای شاخص مشخص شده برای هر فیلد (صعودی یا نزولی)، شاخصها مرتبسازی نهایی را بر اساس فیلد __name__ هر سند اعمال میکنند. مقدار فیلد __name__ برابر با مسیر کامل سند تنظیم میشود. این بدان معناست که اسناد موجود در مجموعه نتایج با مقادیر فیلد یکسان، بر اساس مسیر سند مرتب میشوند.
به طور پیشفرض، فیلد __name__ در همان جهت آخرین فیلد مرتبشده در تعریف اندیس مرتب میشود. برای مثال:
| مجموعه | فیلدهای ایندکس شده | دامنه پرس و جو |
|---|---|---|
| شهرها | نام ، __name__ | مجموعه |
| شهرها | حالت ، __name__ | مجموعه |
| شهرها | کشور ، جمعیت ، __name__ | مجموعه |
برای مرتبسازی نتایج بر اساس جهت غیر پیشفرض __name__ ، باید آن اندیس را ایجاد کنید.
ویژگیهای شاخص
شاخصی که امکان اجرای پرسوجو را با بیشترین کارایی فراهم میکند، با ویژگیهای زیر تعریف میشود:
- فیلدهای مورد استفاده در فیلترهای برابری
- فیلدهای مورد استفاده در مرتبسازی
- فیلدهای مورد استفاده در فیلترهای محدوده و نابرابری (که از قبل در ترتیب مرتبسازی لحاظ نشدهاند)
- فیلدهای مورد استفاده در تجمیعها (که از قبل در مرتبسازیها و فیلترهای دامنه و نابرابری گنجانده نشدهاند)
Cloud Firestore نتایج جستجوها را به شرح زیر محاسبه میکند:
- ایندکس مربوط به مجموعه، ویژگیهای فیلتر، عملگرهای فیلتر و ترتیب مرتبسازی کوئری را شناسایی میکند.
- موقعیت اندیس را که اسکن از آن شروع میشود، مشخص میکند. موقعیت شروع با فیلترهای برابری پرسوجو پیشوند شده و با فیلترهای محدوده و نابرابری در اولین فیلد
orderByپایان مییابد. - شروع به اسکن فهرست میکند و هر سندی را که تمام فیلترها را برآورده میکند، برمیگرداند تا زمانی که فرآیند اسکن یکی از موارد زیر را انجام دهد:
- با سندی مواجه میشود که شرایط فیلتر را ندارد و تأیید میکند که هیچ سند بعدی هرگز به طور کامل شرایط فیلتر را برآورده نخواهد کرد.
- به انتهای شاخص میرسد.
- حداکثر تعداد نتایج درخواستی توسط پرس و جو را جمع آوری می کند.
مثال نمایهسازی
با ایجاد خودکار ایندکسهای تک فیلدی برای شما، 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" });
با استفاده از فهرست تک فیلدی زیر با دامنه مجموعه، میتوانید بر اساس فیلد category ، از مجموعه landmarks یک شهر پرسوجو کنید:
| مجموعه | فیلدهای ایندکس شده | دامنه پرس و جو |
|---|---|---|
| نقاط دیدنی | دسته بندی (یا ) | مجموعه |
وب
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"]
شاخصهای تک فیلدی
- نام شهر ASC
- نام شهر نزولی
- دما.تابستان ASC
- دما.تابستان DESC
- دما.زمستان ASC
- دما.زمستان DESC
- آرایه شامل محلهها (ASC و DESC)
شاخصهای ترکیبی
- نام شهر ASC، آرایه محلهها
- نام شهر DESC، محلهها ARRAY
ورودیهای فهرست
این پیکربندی نمایهسازی منجر به ورودیهای نمایه زیر برای سند میشود:
| فهرست | دادههای فهرستبندی شده |
|---|---|
| ورودیهای فهرست تک فیلدی | |
| نام شهر ASC | city_name: "سانفرانسیسکو" |
| نام شهر نزولی | city_name: "سانفرانسیسکو" |
| دما.تابستان ASC | دما.تابستان: ۶۷ |
| دما.تابستان DESC | دما.تابستان: ۶۷ |
| دما.زمستان ASC | دما.زمستان: ۵۵ |
| دما.زمستان DESC | دما.زمستان: ۵۵ |
| آرایه همسایگی شامل ASC است | محلهها: «ماموریت» |
| آرایه همسایگی شامل DESC است | محلهها: «ماموریت» |
| آرایه همسایگی شامل ASC است | محلهها: «مرکز شهر» |
| آرایه همسایگی شامل DESC است | محلهها: «مرکز شهر» |
| آرایه همسایگی شامل ASC است | محلهها: "مارینا" |
| آرایه همسایگی شامل DESC است | محلهها: "مارینا" |
| ورودیهای فهرست ترکیبی | |
| نام شهر ASC، آرایه محلهها | نام شهر: "سانفرانسیسکو"، محلهها: "ماموریت" |
| نام شهر ASC، آرایه محلهها | city_name: "سانفرانسیسکو", neighborhoods: "مرکز شهر" |
| نام شهر ASC، آرایه محلهها | نام شهر: "سانفرانسیسکو"، محلهها: "مارینا" |
| نام شهر DESC، محلهها ARRAY | نام شهر: "سانفرانسیسکو"، محلهها: "ماموریت" |
| نام شهر DESC، محلهها ARRAY | city_name: "سانفرانسیسکو", neighborhoods: "مرکز شهر" |
| نام شهر 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 در ادغام شاخصها برای بندهای تساوی، تعداد شاخصها را کاهش دهید:
| مجموعه | فیلدهای ایندکس شده | دامنه پرس و جو |
|---|---|---|
| رستورانها | رده ، رتبهبندی ستارهای | مجموعه |
| رستورانها | شهر ، رتبهبندی ستاره | مجموعه |
| رستورانها | ویرایشگران، رتبهبندی | مجموعه |
این مجموعه از ایندکسها نه تنها کوچکتر است، بلکه از یک پرسوجوی اضافی نیز پشتیبانی میکند:
وب
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")محدودیتهای نمایهسازی
محدودیتهای زیر برای شاخصها اعمال میشود. برای اطلاعات بیشتر در مورد سهمیهها و محدودیتها، به بخش سهمیهها و محدودیتها مراجعه کنید.
| حد | جزئیات |
|---|---|
| حداکثر تعداد شاخصهای مرکب برای یک پایگاه داده |
|
| حداکثر تعداد پیکربندیهای تک فیلدی برای یک پایگاه داده |
یک پیکربندی سطح فیلد میتواند شامل چندین پیکربندی برای یک فیلد باشد. برای مثال، یک معافیت نمایهسازی تک فیلدی و یک سیاست TTL در یک فیلد، به عنوان یک پیکربندی فیلد در محدودهی مجاز محاسبه میشوند. |
حداکثر تعداد ورودیهای فهرست برای هر سند | ۴۰،۰۰۰ تعداد ورودیهای فهرست، مجموع موارد زیر برای یک سند است:
برای دیدن اینکه چگونه Cloud Firestore یک سند و مجموعهای از شاخصها را به ورودیهای شاخص تبدیل میکند، به این مثال شمارش ورودی شاخص مراجعه کنید. |
| حداکثر تعداد فیلدها در یک فهرست مرکب | ۱۰۰ |
| حداکثر اندازه یک ورودی فهرست | ۷.۵ کیلوبایت برای دیدن نحوه محاسبه اندازه ورودی شاخص Cloud Firestore ، به اندازه ورودی شاخص مراجعه کنید. |
| حداکثر مجموع اندازههای ورودیهای فهرست یک سند | ۸ مگابایت حجم کل، مجموع موارد زیر برای یک سند است: |
| حداکثر اندازه یک مقدار فیلد اندیسگذاری شده | ۱۵۰۰ بایت مقادیر فیلدهای بالای ۱۵۰۰ بایت کوتاه میشوند. پرسوجوهایی که شامل مقادیر فیلد کوتاهشده هستند ممکن است نتایج متناقضی را برگردانند. |
بهترین شیوههای نمایهسازی
برای اکثر برنامهها، میتوانید برای مدیریت فهرستهای خود به فهرستبندی خودکار و پیوندهای پیام خطا اعتماد کنید. با این حال، ممکن است بخواهید در موارد زیر استثناهای تک فیلدی اضافه کنید:
| مورد | توضیحات |
|---|---|
| میدانهای رشتهای بزرگ | اگر یک فیلد رشتهای دارید که اغلب مقادیر رشتهای طولانی را در خود نگه میدارد و برای پرسوجو از آنها استفاده نمیکنید، میتوانید با معاف کردن این فیلد از فهرستبندی، هزینههای ذخیرهسازی را کاهش دهید. |
| نرخ بالای نوشتن در مجموعهای حاوی اسناد با مقادیر ترتیبی | اگر فیلدی را که به طور متوالی بین اسناد یک مجموعه افزایش یا کاهش مییابد، مانند یک مهر زمانی، فهرستبندی کنید، حداکثر سرعت نوشتن در مجموعه ۵۰۰ نوشتن در ثانیه است. اگر بر اساس فیلدی با مقادیر متوالی پرسوجو نمیکنید، میتوانید فیلد را از فهرستبندی معاف کنید تا از این محدودیت عبور کنید. برای مثال، در یک مورد استفاده از اینترنت اشیا با نرخ نوشتن بالا، مجموعهای شامل اسنادی با فیلد مهر زمانی ممکن است به مرز ۵۰۰ نوشتن در ثانیه برسد. |
| فیلدهای TTL | اگر از سیاستهای TTL (زمان زنده ماندن) استفاده میکنید، توجه داشته باشید که فیلد TTL باید یک مهر زمانی باشد. نمایهسازی در فیلدهای TTL به طور پیشفرض فعال است و میتواند در نرخهای ترافیک بالاتر بر عملکرد تأثیر بگذارد. به عنوان بهترین روش، استثناهای تک فیلدی را برای فیلدهای TTL خود اضافه کنید. |
| فیلدهای آرایهای یا نقشهای بزرگ | فیلدهای آرایه یا نقشه بزرگ میتوانند به مرز ۴۰،۰۰۰ ورودی فهرست در هر سند برسند. اگر بر اساس یک فیلد آرایه یا نقشه بزرگ پرسوجو نمیکنید، باید آن را از فهرستبندی معاف کنید. |
اگر از پرسوجوهایی با عملگرهای دامنه و نابرابری در چندین فیلد استفاده میکنید، ملاحظات نمایهسازی را که باید برای بهینهسازی عملکرد و هزینه پرسوجوهای Cloud Firestore در نظر بگیرید، مشاهده کنید.
برای اطلاعات بیشتر در مورد نحوه حل مشکلات ایندکسگذاری (خطاهای مربوط به تعداد نمایش ایندکس، INVALID_ARGUMENT ) به صفحه عیبیابی مراجعه کنید.