نمایهها عامل مهمی در عملکرد پایگاه داده هستند. درست مانند نمایه کتاب که موضوعات کتاب را به شماره صفحهها نگاشت میکند، نمایه پایگاه داده نیز موارد موجود در پایگاه داده را به مکانهایشان در پایگاه داده نگاشت میکند. وقتی پایگاه دادهای را پُرسمان میکنید، پایگاه داده میتواند از نمایه برای شناسایی سریع مکانهای موارد درخواستی شما استفاده کند.
این صفحه دو نوع نمایهای را که Cloud Firestore استفاده میکند شرح میدهد: نمایههای خودکار و نمایههای دستی.
تعریف و ساختار نمایه
نمایه در فهرستی از فیلدهای یک سند معین تعریف میشود و هر فیلد دارای یک حالت نمایه متناظر است.
نمایه حاوی ورودیای برای هر فیلد نامگذاریشده در تعریف نمایه است. نمایه شامل همه اسنادی است که نتایج احتمالی برای پُرسمانهای مبتنی بر نمایه هستند. سند فقط درصورتی در نمایه گنجانده میشود که مقدار نمایهشدهای برای هر فیلد استفادهشده در نمایه تنظیم شده باشد. اگر تعریف نمایه به فیلدی اشاره کند که سند برای آن مقداری تنظیم نکرده باشد، آن سند در نمایه نشان داده نخواهد شد. در این حالت، سند هرگز بهعنوان نتیجهای برای هیچ پُرسمانی براساس نمایه برگردانده نخواهد شد.
نمایه براساس مقادیر فیلد، به ترتیبی که در تعریف نمایه مشخص شده است، مرتب میشود.
نمایهای پشت هر پُرسمان
اگر نمایهای برای پُرسمان وجود نداشته باشد، اکثر پایگاههای داده محتوایشان را موردبهمورد میخزند، فرایندی کند که با رشد پایگاه داده کندتر هم میشود. Cloud Firestore بااستفاده از نمایهها برای همه پُرسمانها به ارائه عملکرد پُرسمان بالا کمک میکند. درنتیجه، عملکرد پُرسمان به اندازه مجموعه نتایج بستگی دارد و نه به تعداد موارد موجود در پایگاه داده.
مدیریت نمایه کمتر، توسعه برنامه بیشتر
Cloud Firestore دارای ویژگیهایی است که مدت زمانی را که باید برای مدیریت نمایه صرف کنید کاهش میدهد. نمایههای موردنیاز برای ابتداییترین پُرسمانها بهطور خودکار برای شما ایجاد میشود. هنگام استفاده و آزمایش برنامه، Cloud Firestore به شما کمک میکند نمایههای اضافی موردنیاز برنامهتان را شناسایی و ایجاد کنید.
انواع نمایه
Cloud Firestore از دو نوع نمایه استفاده میکند: خودکار و دستی. نمایههای دستی و خودکار در نحوه مدیریت آنها متفاوت هستند.
نمایههای خودکار
بهطور پیشفرض، Cloud Firestore بهطور خودکار برای هر فیلد موجود در اسناد یک مجموعه، نمایه میسازد. این نمایههای تکفیلدی به شما امکان میدهند بسیاری از پُرسمانهای پایه را انجام دهید. نمایههای خودکار را با پیکربندی تنظیمات نمایهسازی خودکار پایگاه داده و معافیتهای نمایه مدیریت میکنید.
پیشفرضهای نمایه خودکار
Cloud Firestore از تنظیمات پیشفرض زیر برای نمایههای خودکار استفاده میکند:
برای هر فیلد غیرآرایهای و غیرنگاشتی، Cloud Firestore دو نمایه محدوده مجموعه تعریف میکند، یکی در حالت صعودی و دیگری در حالت نزولی.
برای هر فیلد نقشه، Cloud Firestore موارد زیر را ایجاد میکند:
- یک نمایه صعودی با گستره مجموعه برای هر زیرفیلد غیرآرایهای و غیرنگاشتی.
- یک نمایه نزولی با گستره مجموعه برای هر زیرفیلد غیرآرایهای و غیرنگاشتی.
- یک نمایه صعودی با گستره مجموعه برای کل مقدار نقشه
- یک نمایه نزولی با گستره مجموعه برای کل مقدار نقشه
- یک نمایه array-contains با گستره مجموعه برای هر زیرفیلد آرایه.
- Cloud Firestore بهصورت بازگشتی هر زیرفیلد نقشه را نمایه میکند.
برای هر فیلد آرایه در سند، Cloud Firestore موارد زیر را ایجاد میکند:
- یک نمایه صعودی با گستره مجموعه برای کل مقدار آرایه
- یک نمایه نزولی با گستره مجموعه برای کل مقدار آرایه
- یک نمایه array-contains با گستره مجموعه.
نمایههای خودکار با دامنه گروه مجموعه بهطور پیشفرض نگهداری نمیشوند.
معافیتهای نمایه خودکار
با ایجاد معافیت نمایهسازی میتوانید فیلدی را از تنظیمات نمایهسازی خودکار معاف کنید. معافیت نمایهسازی تنظیمات نمایه خودکار سراسری پایگاه داده را لغو میکند. یک معافیت میتواند نمایهای را فعال کند که تنظیمات نمایهسازی خودکار شما درغیراینصورت آن را غیرفعال میکرد، یا نمایهای را غیرفعال کند که نمایهسازی خودکار درغیراینصورت آن را فعال میکرد. برای مواردی که معافیتها میتوانند مفید باشند، روالهای مطلوب نمایهسازی را ببینید.
از مقدار مسیر فیلد * برای افزودن معافیتهای نمایه سطح مجموعه در همه فیلدهای گروه مجموعه استفاده کنید. برای مثال، برای گروه مجموعه comments،
مسیر فیلد را روی * تنظیم کنید تا با همه فیلدهای گروه مجموعه comments مطابقت داشته باشد و
نمایهسازی همه فیلدهای زیر گروه مجموعه را غیرفعال کنید. سپس میتوانید
معافیتهایی اضافه کنید تا فقط فیلدهای موردنیاز برای پُرسمانهایتان نمایهسازی شود. کاهش تعداد فیلدهای نمایهشده هزینههای ذخیرهسازی را کاهش میدهد و میتواند عملکرد نوشتن را بهبود بخشد.
اگر برای فیلد نقشه معافیت نمایه ایجاد کنید، زیرفیلدهای نقشه آن تنظیمات را به ارث میبرند. بااینحال، میتوانید معافیتهای نمایه را برای زیرفیلدهای خاص تعریف کنید. اگر معافیتی را برای زیرفیلد حذف کنید، زیرفیلد تنظیمات معافیت والد خود را (درصورت وجود) یا تنظیمات سراسر پایگاه داده را (اگر معافیت والد وجود نداشته باشد) به ارث خواهد برد.
برای ایجاد و مدیریت معافیتهای نمایه خودکار، مدیریت نمایهها را ببینید.
نمایههای دستی
نمایه دستی نگاشت مرتبشدهای از همه اسناد موجود در مجموعه را براساس فهرست مرتبشدهای از فیلدها برای نمایهسازی ذخیره میکند.
Cloud Firestore از نمایههای دستی برای پشتیبانی از پُرسمانهایی استفاده میکند که نمایههای خودکار از آنها پشتیبانی نمیکنند.
بهطور پیشفرض، Cloud Firestore بهطور خودکار نمایههای تکفیلدی برای هر فیلد موجود در مجموعه ایجاد میکند. Cloud Firestore بهطور خودکار برای ترکیب فیلدها نمایه ایجاد نمیکند زیرا تعداد ترکیبهای فیلد ممکن بسیار زیاد است. درعوض، Cloud Firestore به شما کمک میکند نمایههای لازم را هنگام ساختن برنامهتان شناسایی و ایجاد کنید.
هرزمان که پُرسمانی را امتحان کنید که توسط نمایه موجود پشتیبانی نمیشود، Cloud Firestore پیام خطایی با پیوندی برمیگرداند که میتوانید آن را دنبال کنید تا نمایه مفقودشده را ایجاد کنید.
همچنین میتوانید نمایهها را بهصورت دستی بااستفاده از کنسول یا بااستفاده از واسط خط فرمان Firebase تعریف و مدیریت کنید. برای کسب اطلاعات بیشتر درباره ایجاد و مدیریت نمایههای دستی، به مدیریت نمایهها مراجعه کنید.
حالتهای نمایه و دامنههای پُرسمان
نمایههای خودکار و دستی را بهطور متفاوتی پیکربندی میکنید، اما هر دو نیاز دارند که حالتهای نمایه و دامنههای پُرسمان را برای نمایههایتان پیکربندی کنید.
حالتهای نمایه
وقتی نمایهای را تعریف میکنید، برای هر فیلد نمایهشده یک حالت نمایه انتخاب میکنید. حالت نمایه هر فیلد از بندهای پُرسمان خاصی در آن فیلد پشتیبانی میکند. میتوانید از بین حالتهای نمایه زیر انتخاب کنید:
| حالت نمایه | شرح |
|---|---|
| صعودی | از عبارتهای پُرسمان <، <=، ==، >=، >، !=، in، و not-in در فیلد پشتیبانی میکند و از مرتبسازی نتایج بهصورت صعودی براساس مقدار این فیلد پشتیبانی میکند. |
| نزولی | از عبارتهای پُرسمان <، <=، ==، >=، >، !=، in، و not-in در فیلد پشتیبانی میکند و از مرتبسازی نتایج به ترتیب نزولی براساس مقدار این فیلد پشتیبانی میکند. |
| Array‑contains | از عبارتهای پُرسمان array-contains و array-contains-any در فیلد پشتیبانی میکند. |
| Vector | از عبارتهای پُرسمان FindNearest در فیلد پشتیبانی میکند. |
حوزههای پُرسمان
هر نمایه به یک مجموعه یا یک گروه مجموعه محدود میشود. این بهعنوان گستره پُرسمان نمایه شناخته میشود:
- محدوده مجموعه
- Cloud Firestore بهطور پیشفرض نمایهها را با گستره مجموعه ایجاد میکند. این نمایهها از پُرسمانهایی پشتیبانی میکنند که نتایج را از یک مجموعه برمیگردانند.
- محدوده گروه مجموعه
- گروه مجموعه شامل همه مجموعههایی است که شناسه مجموعه یکسانی دارند. برای اجرای پرسوجوی گروه مجموعه که نتایج فیلترشده یا مرتبشده را از گروه مجموعه برمیگرداند، باید نمایه متناظری با گستره گروه مجموعه ایجاد کنید.
ترتیب پیشفرض و فیلد __name__
علاوهبر مرتبسازی اسناد براساس حالتهای نمایه
مشخصشده برای هر فیلد (صعودی یا نزولی)، نمایهها مرتبسازی نهایی را
براساس فیلد __name__ هر سند اعمال میکنند. مقدار فیلد __name__ روی مسیر کامل سند تنظیم شده است. این یعنی اسناد
در مجموعه نتایج با مقادیر فیلد یکسان براساس مسیر سند مرتب میشوند.
بهطور پیشفرض، فیلد __name__ در همان جهت آخرین فیلد مرتبشده در تعریف نمایه مرتب میشود. برای مثال:
| مجموعه | فیلدهای نمایهشده | حوزه پُرسمان |
|---|---|---|
| شهرها | name, __name__ |
مجموعه |
| شهرها | state, __name__ |
مجموعه |
| شهرها | کشور، جمعیت، __name__ |
مجموعه |
برای مرتبسازی نتایج براساس جهت غیرپیشفرض __name__، باید
آن نمایه را ایجاد کنید.
ویژگیهای نمایه
نمایهای که اجازه میدهد پُرسمان بهطور کارآمدتری اجرا شود با ویژگیهای زیر تعریف میشود:
- فیلدهای استفادهشده در فیلترهای برابری
- فیلدهای استفادهشده در ترتیب مرتبسازی
- فیلدهای مورداستفاده در فیلترهای گستره و نابرابری (که قبلاً در ترتیبهای مرتبسازی گنجانده نشدهاند)
- فیلدهای مورداستفاده در تجمیعها (که قبلاً در ترتیبهای مرتبسازی و فیلترهای گستره و نابرابری گنجانده نشدهاند)
Cloud Firestore نتایج پُرسمانها را بهصورت زیر محاسبه میکند:
- نمایه مربوط به مجموعه پُرسمان، ویژگیهای فیلتر، عملگرهای فیلتر، و ترتیبهای مرتبسازی را شناسایی میکند.
- موقعیت نمایهای را که اسکن از آن شروع میشود شناسایی میکند. موقعیت شروع با فیلترهای برابری پُرسمان پیشوند میشود و با فیلترهای محدوده و نابرابری در اولین فیلد
orderByپایان مییابد. - اسکن کردن نمایه را شروع میکند و هر سندی را که همه فیلترها را برآورده کند برمیگرداند تا زمانی که فرایند اسکن یکی از کارهای زیر را انجام دهد:
- با سندی مواجه میشود که شرایط فیلتر را برآورده نمیکند و تأیید میکند که هیچ سند بعدی هرگز شرایط فیلتر را بهطور کامل برآورده نخواهد کرد.
- بهپایان نمایه میرسد.
- حداکثر تعداد نتایج درخواستشده توسط پُرسمان را جمعآوری میکند.
نمونه نمایهسازی
Cloud Firestore با ایجاد خودکار نمایههای تکفیلدی برای شما،
به برنامهتان اجازه میدهد بهسرعت از پایهایترین پُرسمانهای پایگاه داده پشتیبانی کند.
نمایههای تکفیلدی به شما امکان میدهند پُرسمانهای سادهای را براساس مقادیر فیلد
و مقایسهکنندههای <، <=، ==، >=، >، و in انجام دهید. برای فیلدهای آرایه،
به شما امکان میدهند پُرسمانهای array-contains و array-contains-any را اجرا کنید.
برای توضیح بیشتر، مثالهای زیر را از دیدگاه ایجاد نمایه بررسی کنید. قطعه کد زیر چند سند city را در مجموعه cities ایجاد میکند و فیلدهای name، state، country، capital، population، و regions را برای هر سند تنظیم میکند:
وب
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)
| مجموعه | فیلدهای نمایهشده | حوزه پُرسمان |
|---|---|---|
| شهرها | برچسبهای array-contains، (یا ) حروف بزرگ | مجموعه |
پرسوجوهای پشتیبانیشده توسط نمایههای گروه مجموعه
برای نشان دادن نمایهای با گستره گروه مجموعه،
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
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- آرایه محلهها شامل
نمایههای دستی
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
ورودیهای نمایه
این پیکربندی نمایهسازی منجر به ورودیهای نمایه زیر برای سند میشود:
| نمایه | دادههای نمایهشده |
|---|---|
| ورودیهای نمایه خودکار | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| محلهها صعودی | محلهها: ["Mission", "Downtown", "Marina"] |
| محلهها DESC | محلهها: ["Mission", "Downtown", "Marina"] |
| دما ASC | دما: {summer: 67, winter: 55} |
| دما DESC | دما: {summer: 67, winter: 55} |
| temperatures.summer ASC | temperatures.summer: 67 |
| temperatures.summer DESC | temperatures.summer: 67 |
| temperatures.winter ASC | temperatures.winter: 55 |
| temperatures.winter DESC | temperatures.winter: 55 |
| آرایه محلهها شامل | محلهها: «Mission» |
| آرایه محلهها شامل | محلهها: «مرکز شهر» |
| آرایه محلهها شامل | محلهها: «مارینا» |
| ورودیهای نمایه دستی | |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
شاخصها و قیمتگذاری
نمایهها در هزینههای فضای ذخیرهسازی برنامه شما نقش دارند. برای اطلاعات بیشتر درباره نحوه محاسبه اندازه فضای ذخیرهسازی برای نمایهها، به اندازه ورودی نمایه مراجعه کنید.
استفاده از ادغام نمایه
اگرچه Cloud Firestore برای هر پُرسمان از یک نمایه استفاده میکند،
لزوماً برای هر پُرسمان به یک نمایه نیاز ندارد. برای پرسمانهایی با چند عبارت برابری
(==) و، بهصورت اختیاری، یک عبارت orderBy، Cloud Firestore میتواند
از نمایههای موجود مجدداً استفاده کند. Cloud Firestore میتواند نمایههای فیلترهای برابری ساده را ادغام کند تا نمایههای موردنیاز برای پُرسمانهای برابری بزرگتر را بسازد.
با شناسایی موقعیتهایی که میتوانید از ادغام نمایه استفاده کنید، میتوانید هزینههای نمایهسازی را کاهش دهید. برای مثال، در مجموعه restaurants برای برنامه ردهبندی رستوران:
رستوران
burgerthyme
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")میتوانید برای هر پُرسمان نمایهای ایجاد کنید:
| مجموعه | فیلدهای نمایهشده | حوزه پُرسمان |
|---|---|---|
| رستورانها | دسته، ردهبندی ستارهای | مجموعه |
| رستورانها | city, star_rating | مجموعه |
| رستورانها | category, city, star_rating | مجموعه |
| رستورانها | category, city, editors_pick, star_rating | مجموعه |
بهعنوان راهحل بهتر، میتوانید با بهرهگیری از توانایی Cloud Firestore در ادغام نمایهها برای عبارتهای برابری، تعداد نمایهها را کاهش دهید:
| مجموعه | فیلدهای نمایهشده | حوزه پُرسمان |
|---|---|---|
| رستورانها | دسته، ردهبندی ستارهای | مجموعه |
| رستورانها | city, star_rating | مجموعه |
| رستورانها | editors_pick, star_rating | مجموعه |
این مجموعه نمایهها نهتنها کوچکتر است، بلکه از پرسمان دیگری نیز پشتیبانی میکند:
وب
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")محدودیتهای نمایهسازی
محدودیتهای زیر برای نمایهها اعمال میشود. برای اطلاعات بیشتر درباره سهمیهها و محدودیتها، سهمیهها و محدودیتها را ببینید.
| حد | جزئیات |
|---|---|
| حداکثر تعداد نمایههای ترکیبی برای پایگاه داده |
|
| حداکثر تعداد پیکربندیهای تکفیلدی برای پایگاه داده |
یک پیکربندی سطح فیلد میتواند حاوی چندین پیکربندی برای یک فیلد باشد. برای مثال، یک معافیت نمایهسازی تکفیلدی و یک خطمشی TTL در همان فیلد بهعنوان یک پیکربندی فیلد در محدودیت حساب میشوند. |
|
حداکثر تعداد ورودیهای نمایه برای هر سند |
۴۰٬۰۰۰ تعداد ورودیهای نمایه مجموع موارد زیر برای یک سند است:
برای دیدن اینکه Cloud Firestore چگونه یک سند و مجموعهای از نمایهها را به ورودیهای نمایه تبدیل میکند، این نمونه شمارش ورودی نمایه را ببینید. |
| حداکثر تعداد فیلدها در نمایه ترکیبی | 100 |
| حداکثر اندازه ورودی نمایه |
۷٫۵ کیبیبایت برای دیدن نحوه محاسبه اندازه ورودی نمایه توسط Cloud Firestore، اندازه ورودی نمایه را ببینید. |
| حداکثر مجموع اندازههای ورودیهای نمایه سند |
۸ مبیبایت اندازه کل عبارت است از مجموع موارد زیر برای یک سند: |
| حداکثر اندازه مقدار فیلد نمایهشده |
۱۵۰۰ بایت مقادیر فیلد بیشتر از ۱۵۰۰ بایت کوتاه میشوند. پُرسمانهای شامل مقادیر فیلد کوتاه ممکن است نتایج متناقضی برگردانند. |
روالهای مطلوب نمایهسازی
برای اکثر برنامهها، میتوانید به نمایهسازی خودکار و پیوندهای پیام خطا برای مدیریت نمایههایتان تکیه کنید. بااینحال، ممکن است بخواهید در موارد زیر معافیتهای نمایهسازی خودکار اضافه کنید:
| جلد محافظ | شرح |
|---|---|
| فیلدهای رشتهای بزرگ | اگر فیلد رشتهای دارید که اغلب مقادیر رشتهای طولانی دارد که از آنها برای پُرسمان استفاده نمیکنید، میتوانید با معاف کردن فیلد از نمایهسازی، هزینههای فضای ذخیرهسازی را کاهش دهید. |
| نرخهای نوشتن بالا در مجموعهای که حاوی اسناد با مقادیر متوالی است | اگر فیلدی را نمایه کنید که بهطور متوالی بین اسناد در یک مجموعه افزایش یا کاهش مییابد، مانند مُهر زمان، حداکثر نرخ نوشتن در مجموعه ۵۰۰ نوشتن در ثانیه است. اگر براساس فیلد دارای مقادیر متوالی پُرسمان نمیکنید، میتوانید فیلد را از نمایهسازی معاف کنید تا این محدودیت را دور بزنید. برای مثال، در مورد کاربرد اینترنت اشیا با نرخ نوشتن بالا، مجموعهای که حاوی اسناد با فیلد مُهر زمان است ممکن است به حد ۵۰۰ نوشتن در ثانیه نزدیک شود. |
| فیلدهای TTL |
اگر از خطمشیهای TTL (زمان بقا) استفاده میکنید، توجه داشته باشید که فیلد TTL باید مُهر زمان باشد. نمایهسازی در فیلدهای TTL بهطور پیشفرض فعال است و میتواند بر عملکرد در نرخهای ترافیک بالاتر تأثیر بگذارد. بهعنوان روال مطلوب، معافیتهای نمایهسازی خودکار را برای فیلدهای TTL خود اضافه کنید. |
| آرایه بزرگ یا فیلدهای نقشه | فیلدهای نقشه یا آرایه بزرگ میتوانند به حد مجاز ۴۰٬۰۰۰ ورودی نمایه برای هر سند نزدیک شوند. اگر براساس آرایه بزرگ یا فیلد نقشه پُرسمان نمیکنید، باید آن را از نمایهسازی معاف کنید. |
اگر از پُرسمانهایی با عملگرهای محدوده و نابرابری در چندین فیلد استفاده میکنید، ملاحظات نمایهسازی را ببینید که باید برای بهینهسازی عملکرد و هزینه پُرسمانهای Cloud Firestore درنظر بگیرید.
برای اطلاعات بیشتر درباره نحوه حلوفصل کردن مشکلات نمایهسازی (توزیع نمایه، خطاهای INVALID_ARGUMENT)، به صفحه عیبیابی مراجعه کنید.