انواع ایندکس در 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 به شما کمک می‌کند تا هنگام ساخت برنامه خود، شاخص‌های مورد نیاز را شناسایی و ایجاد کنید .

هر زمان که شما یک کوئری را اجرا می‌کنید که توسط یک شاخص موجود پشتیبانی نمی‌شود، 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 نتایج جستجوها را به شرح زیر محاسبه می‌کند:

  1. ایندکس مربوط به مجموعه، ویژگی‌های فیلتر، عملگرهای فیلتر و ترتیب مرتب‌سازی کوئری را شناسایی می‌کند.
  2. موقعیت اندیس را که اسکن از آن شروع می‌شود، مشخص می‌کند. موقعیت شروع با فیلترهای برابری پرس‌وجو پیشوند شده و با فیلترهای محدوده و نابرابری در اولین فیلد orderBy پایان می‌یابد.
  3. شروع به اسکن فهرست می‌کند و هر سندی را که تمام فیلترها را برآورده می‌کند، برمی‌گرداند تا زمانی که فرآیند اسکن یکی از موارد زیر را انجام دهد:
    • با سندی مواجه می‌شود که شرایط فیلتر را ندارد و تأیید می‌کند که هیچ سند بعدی هرگز به طور کامل شرایط فیلتر را برآورده نخواهد کرد.
    • به انتهای شاخص می‌رسد.
    • حداکثر تعداد نتایج درخواستی توسط پرس و جو را جمع آوری می کند.

مثال نمایه‌سازی

با ایجاد خودکار ایندکس‌های تک فیلدی برای شما، 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"])

پرس‌وجوهای پشتیبانی‌شده توسط ایندکس‌های دستی

برای پشتیبانی از پرس‌وجوهای ترکیبی که از قبل توسط ایندکس‌های تک‌فیلدی خودکار پشتیبانی نمی‌شوند، ایندکس‌های دستی ایجاد کنید. به عنوان مثال، برای پرس‌وجوهای زیر به یک ایندکس دستی نیاز دارید:

وب
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
  • دما نزولی
  • دما.تابستان ASC
  • دما.تابستان DESC
  • دما.زمستان ASC
  • دما.زمستان DESC
  • آرایه شامل محله‌ها است

شاخص‌های دستی

  • نام شهر ASC، آرایه محله‌ها
  • نام شهر DESC، محله‌ها ARRAY

ورودی‌های فهرست

این پیکربندی نمایه‌سازی منجر به ورودی‌های نمایه زیر برای سند می‌شود:

فهرست داده‌های فهرست‌بندی شده
ورودی‌های خودکار فهرست
نام شهر ASC city_name: "سانفرانسیسکو"
نام شهر نزولی city_name: "سانفرانسیسکو"
محله‌های ASC محله‌ها: ["ماموریت"، "مرکز شهر"، "مارینا"]
محله‌ها DESC محله‌ها: ["ماموریت"، "مرکز شهر"، "مارینا"]
دماهای ASC دما: {تابستان: ۶۷، زمستان: ۵۵}
دما نزولی دما: {تابستان: ۶۷، زمستان: ۵۵}
دما.تابستان 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 ) به صفحه عیب‌یابی مراجعه کنید.