انواع ایندکس در Cloud Firestore

شاخص ها عامل مهمی در عملکرد یک پایگاه داده هستند. مانند نمایه کتابی که موضوعات یک کتاب را به شماره صفحه ترسیم می کند، فهرست پایگاه داده موارد موجود در پایگاه داده را به مکان آنها در پایگاه داده نگاشت می کند. هنگامی که یک پرس و جو برای یک پایگاه داده ارسال می کنید، پایگاه داده می تواند از یک فهرست برای جستجوی سریع مکان موارد درخواستی شما استفاده کند.

این صفحه دو نوع نمایه‌ای را که 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__ ، باید آن شاخص را ایجاد کنید.

شاخص کامل

شاخص کامل برای یک پرس و جو، که اجازه می دهد پرس و جو به بهترین شکل اجرا شود، بر روی ویژگی های زیر تعریف می شود، به ترتیب:

  1. فیلدهای مورد استفاده در فیلترهای برابری
  2. فیلدهای مورد استفاده در ترتیب مرتب سازی
  3. فیلدهای مورد استفاده در فیلترهای محدوده و نابرابری (که قبلاً در ترتیب مرتب سازی گنجانده نشده اند)
  4. فیلدهای مورد استفاده در تجمیع (که قبلاً در ترتیب مرتب سازی و فیلترهای محدوده و نابرابری گنجانده نشده اند)

Firestore نتایج را برای پرس و جوها به صورت زیر محاسبه می کند:

  1. نمایه مربوط به مجموعه پرس و جو، ویژگی های فیلتر، عملگرهای فیلتر و ترتیب مرتب سازی را شناسایی می کند.
  2. موقعیت فهرست را برای شروع اسکن از استفاده از فیلترهای برابری پرس و جو و فیلترهای محدوده و نابرابری در اولین مرتبه بر اساس فیلد مشخص می کند.
  3. شروع به اسکن فهرست، برگرداندن هر سندی که همه فیلترها را برآورده می کند، تا زمانی که:
    1. با سندی مواجه می شود که شرایط فیلتر را ندارد و تأیید می کند که هر سند بعدی هرگز به طور کامل شرایط فیلتر را ندارد، یا
    2. به انتهای شاخص می رسد یا
    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 یک شاخص تک فیلدی صعودی در هر فیلد غیر آرایه، یک شاخص تک فیلدی نزولی در هر فیلد غیر آرایه و یک آرایه حاوی شاخص تک فیلدی برای فیلد آرایه به روز می کند. هر سطر در جدول زیر نشان دهنده ورودی یک شاخص تک فیلدی است:

مجموعه فیلد نمایه شده است محدوده پرس و جو
شهرها نام مجموعه
شهرها حالت مجموعه
شهرها کشور مجموعه
شهرها مجموعه
شهرها جمعیت مجموعه
شهرها نام مجموعه
شهرها حالت مجموعه
شهرها کشور مجموعه
شهرها capital مجموعه
شهرها جمعیت مجموعه
شهرها 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" });

با استفاده از نمایه تک فیلدی زیر با دامنه مجموعه، می‌توانید مجموعه landmarks یک شهر را بر اساس فیلد category جستجو کنید:

مجموعه فیلدهای نمایه شده محدوده پرس و جو
نقاط دیدنی دسته (یا ). مجموعه
وب
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"]

شاخص های تک فیلد

  • city_name ASC
  • city_name DESC
  • دماها.تابستان ASC
  • دماها.تابستان DESC
  • دماهای. زمستان ASC
  • دماها. زمستان DESC
  • آرایه های همسایگی شامل (ASC و DESC)

شاخص های ترکیبی

  • city_name ASC، محله‌ها ARRAY
  • city_name DESC، محله‌ها ARRAY

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

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

فهرست مطالب داده های نمایه شده
ورودی های فهرست تک فیلدی
city_name ASC city_name: "سان فرانسیسکو"
city_name DESC city_name: "سان فرانسیسکو"
دماها.تابستان ASC دما.تابستان: 67
دماها.تابستان DESC دما.تابستان: 67
دماهای. زمستان ASC دما.زمستان: 55
دماها. زمستان DESC دما.زمستان: 55
آرایه محله ها حاوی ASC است محله ها: "ماموریت"
آرایه محله ها حاوی DESC است محله ها: "ماموریت"
آرایه محله ها حاوی ASC است محله ها: "مرکز شهر"
آرایه محله ها حاوی DESC است محله ها: "مرکز شهر"
آرایه محله ها حاوی ASC است محله ها: "مارینا"
آرایه محله ها حاوی DESC است محله ها: "مارینا"
ورودی های فهرست ترکیبی
city_name ASC، محله‌ها ARRAY city_name: "سان فرانسیسکو"، محله ها: "مأموریت"
city_name ASC، محله‌ها ARRAY city_name: "سان فرانسیسکو"، محله ها: "مرکز شهر"
city_name ASC، محله‌ها ARRAY city_name: "سان فرانسیسکو"، محله ها: "Marina"
city_name DESC، محله‌ها ARRAY city_name: "سان فرانسیسکو"، محله ها: "مأموریت"
city_name DESC، محله‌ها ARRAY city_name: "سان فرانسیسکو"، محله ها: "مرکز شهر"
city_name DESC، محله‌ها ARRAY city_name: "سان فرانسیسکو"، محله ها: "Marina"

شاخص ها و قیمت گذاری

ایندکس ها به هزینه های ذخیره سازی برنامه شما کمک می کنند. برای اطلاعات بیشتر در مورد نحوه محاسبه اندازه ذخیره سازی برای نمایه ها، به اندازه ورودی فهرست مراجعه کنید.

بهره گیری از ادغام شاخص ها

اگرچه 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")

می توانید برای هر پرس و جو یک شاخص ایجاد کنید:

مجموعه فیلدهای نمایه شده محدوده پرس و جو
رستوران ها دسته ، star_rating مجموعه
رستوران ها city، star_rating مجموعه
رستوران ها رده ، شهر ، رتبه_ستاره مجموعه
رستوران ها دسته ، شهر انتخاب ویرایشگران_پیکان_بالا، رتبه_ستاره مجموعه

به‌عنوان راه‌حل بهتر، می‌توانید با استفاده از توانایی Cloud Firestore برای ادغام فهرست‌ها برای بندهای برابری، تعداد ایندکس‌ها را کاهش دهید:

مجموعه فیلدهای نمایه شده محدوده پرس و جو
رستوران ها دسته ، star_rating مجموعه
رستوران ها city، star_rating مجموعه
رستوران ها editors_pick، star_rating مجموعه

این مجموعه از ایندکس ها نه تنها کوچکتر است، بلکه از یک پرس و جو اضافی نیز پشتیبانی می کند:

وب
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

محدودیت های نمایه سازی

محدودیت های زیر برای شاخص ها اعمال می شود. برای همه سهمیه‌ها و محدودیت‌ها، سهمیه‌ها و محدودیت‌ها را ببینید.

حد جزئیات
حداکثر تعداد نمایه های ترکیبی برای یک پایگاه داده
حداکثر تعداد تنظیمات تک فیلد برای یک پایگاه داده

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

حداکثر تعداد ورودی های فهرست برای هر سند

40000

تعداد ورودی‌های فهرست مجموع موارد زیر برای یک سند است:

  • تعداد ورودی های فهرست تک فیلدی
  • تعداد ورودی های شاخص ترکیبی

برای اینکه ببینید چگونه Cloud Firestore یک سند و مجموعه‌ای از نمایه‌ها را به ورودی‌های فهرست تبدیل می‌کند، به این مثال تعداد ورودی فهرست مراجعه کنید.

حداکثر تعداد فیلدها در یک نمایه ترکیبی 100
حداکثر اندازه یک ورودی شاخص

7.5 کیلو بایت

برای مشاهده نحوه محاسبه اندازه ورودی فهرست توسط Cloud Firestore، به اندازه ورودی فهرست مراجعه کنید.

حداکثر مجموع اندازه های ورودی های فهرست یک سند

8 مگابایت

اندازه کل مجموع موارد زیر برای یک سند است:

  • مجموع اندازه ورودی های فهرست تک فیلدی یک سند
  • مجموع اندازه ورودی های فهرست ترکیبی یک سند
  • حداکثر اندازه یک مقدار فیلد نمایه شده

    1500 بایت

    مقادیر فیلد بیش از 1500 بایت کوتاه شده است. پرس و جوهایی که شامل مقادیر فیلد کوتاه شده هستند ممکن است نتایج متناقضی را ارائه دهند.

    نمایه سازی بهترین شیوه ها

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

    مورد شرح
    فیلدهای رشته ای بزرگ

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

    نرخ بالای نوشتن در مجموعه ای حاوی اسناد با مقادیر متوالی

    اگر فیلدی را نمایه کنید که به صورت متوالی بین اسناد یک مجموعه افزایش یا کاهش می‌یابد، مانند مهر زمانی، حداکثر سرعت نوشتن در مجموعه 500 نوشتن در ثانیه است. اگر بر اساس فیلد با مقادیر ترتیبی پرس و جو نمی کنید، می توانید برای دور زدن این محدودیت، فیلد را از نمایه سازی معاف کنید.

    به عنوان مثال، در یک مورد استفاده از اینترنت اشیا با نرخ نوشتن بالا، مجموعه‌ای حاوی اسناد با یک فیلد مهر زمانی ممکن است به محدودیت 500 نوشتن در ثانیه نزدیک شود.

    فیلدهای TTL

    اگر از خط‌مشی‌های TTL (زمان تا زندگی) استفاده می‌کنید، توجه داشته باشید که فیلد TTL باید مهر زمانی باشد. نمایه سازی در فیلدهای TTL به طور پیش فرض فعال است و می تواند بر عملکرد در نرخ ترافیک بالاتر تأثیر بگذارد. به عنوان بهترین روش، معافیت های تک فیلدی را برای فیلدهای TTL خود اضافه کنید.

    آرایه های بزرگ یا فیلدهای نقشه

    آرایه های بزرگ یا فیلدهای نقشه می توانند به محدودیت 40000 ورودی فهرست در هر سند نزدیک شوند. اگر بر اساس یک آرایه بزرگ یا فیلد نقشه پرس و جو نمی کنید، باید آن را از نمایه سازی معاف کنید.

    اگر از پرس‌و‌جوهایی با عملگرهای محدوده و نابرابری در چندین فیلد استفاده می‌کنید، ملاحظات نمایه‌سازی را که باید برای بهینه‌سازی عملکرد و هزینه جستجوهای Cloud Firestore در نظر بگیرید، ببینید.

    برای اطلاعات بیشتر در مورد نحوه حل مشکلات نمایه سازی (نمایه fanout، خطاهای INVALID_ARGUMENT ) صفحه عیب یابی را بررسی کنید.