একটি ডাটাবেসের কার্যকারিতার ক্ষেত্রে ইনডেক্স একটি গুরুত্বপূর্ণ উপাদান। অনেকটা একটি বইয়ের সূচিপত্রের মতো, যা বইয়ের বিষয়বস্তুকে পৃষ্ঠা নম্বরের সাথে সংযুক্ত করে, একটি ডাটাবেস ইনডেক্স ডাটাবেসের আইটেমগুলোকে তাদের অবস্থানের সাথে সংযুক্ত করে। আপনি যখন একটি ডাটাবেসে কোয়েরি করেন, তখন ডাটাবেসটি আপনার অনুরোধ করা আইটেমগুলোর অবস্থান দ্রুত শনাক্ত করতে ইনডেক্স ব্যবহার করতে পারে।
এই পৃষ্ঠায় Cloud Firestore দ্বারা ব্যবহৃত দুই ধরনের ইনডেক্স— স্বয়ংক্রিয় ইনডেক্স এবং ম্যানুয়াল ইনডেক্স— সম্পর্কে বর্ণনা করা হয়েছে।
সূচকের সংজ্ঞা এবং কাঠামো
একটি প্রদত্ত ডকুমেন্টের ফিল্ডগুলোর তালিকার উপর ভিত্তি করে একটি ইনডেক্স সংজ্ঞায়িত করা হয়, যেখানে প্রতিটি ফিল্ডের জন্য একটি সংশ্লিষ্ট ইনডেক্স মোড থাকে।
একটি ইনডেক্সে, ইনডেক্স ডেফিনিশনে উল্লেখিত প্রতিটি ফিল্ডের জন্য একটি করে এন্ট্রি থাকে। ইনডেক্সের উপর ভিত্তি করে করা কোয়েরির সম্ভাব্য ফলাফল হিসেবে বিবেচিত সমস্ত ডকুমেন্ট এই ইনডেক্সে অন্তর্ভুক্ত থাকে। একটি ডকুমেন্ট তখনই ইনডেক্সে অন্তর্ভুক্ত হয়, যখন ইনডেক্সে ব্যবহৃত প্রতিটি ফিল্ডের জন্য সেটির একটি ইনডেক্সড ভ্যালু সেট করা থাকে। যদি ইনডেক্স ডেফিনিশনে এমন কোনো ফিল্ডের উল্লেখ থাকে যার জন্য ডকুমেন্টটিতে কোনো ভ্যালু সেট করা নেই, তবে সেই ডকুমেন্টটি ইনডেক্সে প্রদর্শিত হবে না। এই ক্ষেত্রে, ইনডেক্সের উপর ভিত্তি করে করা কোনো কোয়েরির ফলাফল হিসেবে ডকুমেন্টটি কখনোই ফেরত আসবে না।
ইনডেক্সটি ফিল্ডের মান অনুসারে, ইনডেক্স সংজ্ঞায় নির্দিষ্ট করা ক্রমানুসারে সাজানো হয়।
প্রতিটি কোয়েরির পিছনে একটি ইনডেক্স থাকে
কোনো কোয়েরির জন্য যদি ইনডেক্স না থাকে, তবে বেশিরভাগ ডেটাবেস তার কন্টেন্টের মধ্যে একটি একটি করে আইটেম খুঁজে বের করে, যা একটি ধীর প্রক্রিয়া এবং ডেটাবেসের আকার বাড়ার সাথে সাথে এই গতি আরও কমে যায়। Cloud Firestore সমস্ত কোয়েরির জন্য ইনডেক্স ব্যবহার করে উচ্চ কোয়েরি পারফরম্যান্স প্রদানে সহায়তা করে। ফলে, কোয়েরির পারফরম্যান্স ডেটাবেসের আইটেমের সংখ্যার উপর নয়, বরং রেজাল্ট সেটের আকারের উপর নির্ভর করে।
ইনডেক্স ব্যবস্থাপনা কম, অ্যাপ ডেভেলপমেন্ট বেশি
Cloud Firestore এমন কিছু ফিচার রয়েছে যা ইনডেক্স ব্যবস্থাপনার জন্য আপনার প্রয়োজনীয় সময় কমিয়ে দেয়। সবচেয়ে সাধারণ কোয়েরিগুলোর জন্য প্রয়োজনীয় ইনডেক্সগুলো আপনার জন্য স্বয়ংক্রিয়ভাবে তৈরি হয়ে যায়। আপনি যখন আপনার অ্যাপ ব্যবহার ও পরীক্ষা করেন, তখন Cloud Firestore আপনার অ্যাপের জন্য প্রয়োজনীয় অতিরিক্ত ইনডেক্সগুলো শনাক্ত করতে ও তৈরি করতে সাহায্য করে।
সূচকের প্রকারভেদ
Cloud Firestore দুই ধরনের ইনডেক্স ব্যবহার করে: অটোমেটিক এবং ম্যানুয়াল । ম্যানুয়াল এবং অটোমেটিক ইনডেক্সের ব্যবস্থাপনার মধ্যে পার্থক্য রয়েছে।
স্বয়ংক্রিয় সূচক
ডিফল্টরূপে, Cloud Firestore একটি কালেকশনের ডকুমেন্টগুলোতে উপস্থিত প্রতিটি ফিল্ডের জন্য স্বয়ংক্রিয়ভাবে ইনডেক্স তৈরি করে। এই একক-ফিল্ড ইনডেক্সগুলো আপনাকে অনেক মৌলিক কোয়েরি সম্পাদন করতে দেয়। আপনি আপনার ডাটাবেসের স্বয়ংক্রিয় ইনডেক্সিং সেটিংস এবং ইনডেক্স ছাড় কনফিগার করার মাধ্যমে স্বয়ংক্রিয় ইনডেক্সগুলো পরিচালনা করেন।
স্বয়ংক্রিয় সূচক ডিফল্ট
Cloud Firestore স্বয়ংক্রিয় ইনডেক্সের জন্য নিম্নলিখিত ডিফল্ট সেটিংস ব্যবহার করে:
প্রতিটি নন-অ্যারে এবং নন-ম্যাপ ফিল্ডের জন্য, Cloud Firestore দুটি কালেকশন-স্কোপ ইনডেক্স সংজ্ঞায়িত করে, একটি অ্যাসেন্ডিং মোডে এবং অন্যটি ডিসেন্ডিং মোডে।
প্রতিটি ম্যাপ ফিল্ডের জন্য, Cloud Firestore নিম্নলিখিতগুলি তৈরি করে:
- প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি করে কালেকশন-স্কোপ ঊর্ধ্বক্রমিক ইনডেক্স।
- প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি করে কালেকশন-স্কোপের অবরোহী সূচক।
- সম্পূর্ণ ম্যাপ মানের জন্য একটি সংগ্রহ-পরিসরের আরোহী সূচক।
- সম্পূর্ণ ম্যাপ মানের জন্য একটি সংগ্রহ-পরিসরের অবরোহী সূচক।
- একটি কালেকশন-স্কোপ অ্যারেতে প্রতিটি অ্যারে সাবফিল্ডের জন্য ইনডেক্স থাকে।
- Cloud Firestore পুনরাবৃত্তিমূলকভাবে প্রতিটি ম্যাপ সাবফিল্ডকে সূচীবদ্ধ করে।
একটি ডকুমেন্টের প্রতিটি অ্যারে ফিল্ডের জন্য, Cloud Firestore নিম্নলিখিত বিষয়গুলো তৈরি করে:
- সম্পূর্ণ অ্যারের মানটির জন্য একটি সংগ্রহ-পরিসরের আরোহী সূচক।
- সম্পূর্ণ অ্যারের মানের জন্য একটি সংগ্রহ-পরিসরের অবরোহী সূচক।
- একটি কালেকশন-স্কোপ অ্যারে-ইনডেক্স ধারণ করে।
কালেকশন গ্রুপ স্কোপের স্বয়ংক্রিয় ইনডেক্সগুলো ডিফল্টরূপে রক্ষণাবেক্ষণ করা হয় না।
স্বয়ংক্রিয় সূচক ছাড়
আপনি একটি ইনডেক্সিং এক্সেমশন তৈরি করে আপনার অটোমেটিক ইনডেক্সিং সেটিংস থেকে কোনো ফিল্ডকে অব্যাহতি দিতে পারেন। একটি ইনডেক্সিং এক্সেমশন ডাটাবেস-ব্যাপী অটোমেটিক ইনডেক্স সেটিংসকে ওভাররাইড করে। একটি এক্সেমশন এমন একটি ইনডেক্সকে সক্রিয় করতে পারে যা আপনার অটোমেটিক ইনডেক্সিং সেটিংস অন্যথায় নিষ্ক্রিয় করে দিত, অথবা এমন একটি ইনডেক্সকে নিষ্ক্রিয় করতে পারে যা অটোমেটিক ইনডেক্সিং অন্যথায় সক্রিয় করত। যেসব ক্ষেত্রে এক্সেমশন কার্যকর হতে পারে, তার জন্য ইনডেক্সিং বেস্ট প্র্যাকটিসেস দেখুন।
একটি কালেকশন গ্রুপের সমস্ত ফিল্ডে কালেকশন-স্তরের ইনডেক্স ছাড় যোগ করতে * ফিল্ড পাথ ভ্যালুটি ব্যবহার করুন। উদাহরণস্বরূপ, comments কালেকশন গ্রুপের জন্য, ‘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__ | সংগ্রহ |
| শহরগুলি | state, __name__ | সংগ্রহ |
| শহরগুলি | country, population, __name__ | সংগ্রহ |
ডিফল্ট __name__ দিক ছাড়া অন্য কোনো দিক অনুযায়ী ফলাফল সাজাতে হলে, আপনাকে সেই ইনডেক্সটি তৈরি করতে হবে।
সূচক বৈশিষ্ট্য
যে ইনডেক্স কোয়েরিটিকে সবচেয়ে দক্ষতার সাথে সম্পাদন করতে সাহায্য করে, তা নিম্নলিখিত বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়:
- সমতা ফিল্টারে ব্যবহৃত ক্ষেত্রগুলি
- সাজানোর ক্রমে ব্যবহৃত ক্ষেত্রগুলি
- রেঞ্জ এবং অসমতা ফিল্টারে ব্যবহৃত ফিল্ডসমূহ (যেগুলো ইতিমধ্যে সর্ট অর্ডারে অন্তর্ভুক্ত নয়)
- অ্যাগ্রিগেশনে ব্যবহৃত ফিল্ডসমূহ (যেগুলো ইতিমধ্যে সর্ট অর্ডার এবং রেঞ্জ ও ইনইকুয়ালিটি ফিল্টারে অন্তর্ভুক্ত নয়)
Cloud Firestore কোয়েরির ফলাফল নিম্নরূপে গণনা করে:
- কোয়েরির কালেকশন, ফিল্টার প্রোপার্টি, ফিল্টার অপারেটর এবং সর্ট অর্ডারের সাথে সংশ্লিষ্ট ইনডেক্স শনাক্ত করে।
- এটি সেই ইনডেক্স অবস্থানকে চিহ্নিত করে যেখান থেকে স্ক্যানিং শুরু হয়। শুরুর অবস্থানের আগে কোয়েরির ইকুয়ালিটি ফিল্টারগুলো থাকে এবং এটি প্রথম
orderByফিল্ডের রেঞ্জ ও ইনইকুয়ালিটি ফিল্টার দিয়ে শেষ হয়। - ইনডেক্স স্ক্যান করা শুরু করে এবং সমস্ত ফিল্টার পূরণকারী প্রতিটি ডকুমেন্ট ফেরত পাঠাতে থাকে, যতক্ষণ না স্ক্যানিং প্রক্রিয়াটি নিম্নলিখিত কাজগুলোর মধ্যে একটি সম্পন্ন করে:
- এমন একটি নথি পাওয়া যায় যা ফিল্টারের শর্ত পূরণ করে না এবং নিশ্চিত করে যে পরবর্তী কোনো নথিও আর কখনো ফিল্টারের শর্তগুলো সম্পূর্ণরূপে পূরণ করবে না।
- সূচিপত্রের শেষ প্রান্তে পৌঁছায়।
- কোয়েরি দ্বারা অনুরোধ করা সর্বাধিক সংখ্যক ফলাফল সংগ্রহ করে।
সূচীকরণের উদাহরণ
আপনার জন্য স্বয়ংক্রিয়ভাবে সিঙ্গেল-ফিল্ড ইনডেক্স তৈরি করার মাধ্যমে, Cloud Firestore আপনার অ্যাপ্লিকেশনকে সবচেয়ে মৌলিক ডাটাবেস কোয়েরিগুলো দ্রুত সমর্থন করতে সক্ষম করে। সিঙ্গেল-ফিল্ড ইনডেক্স আপনাকে ফিল্ডের মান এবং < , <= , == , >= , > , ও in কম্প্যারেটরগুলোর উপর ভিত্তি করে সাধারণ কোয়েরি সম্পাদন করতে দেয়। অ্যারে ফিল্ডের ক্ষেত্রে, এগুলো আপনাকে array-contains এবং array-contains-any কোয়েরি সম্পাদন করতে দেয়।
উদাহরণস্বরূপ, ইনডেক্স তৈরির দৃষ্টিকোণ থেকে নিম্নলিখিত উদাহরণগুলো পরীক্ষা করুন। নিচের কোড স্নিপেটটি একটি ' cities কালেকশনে কয়েকটি city ডকুমেন্ট তৈরি করে এবং প্রতিটি ডকুমেন্টের জন্য 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 প্রতিটি ফিল্ডের জন্য একটি আরোহী একক-ফিল্ড ইনডেক্স, একটি অবরোহী একক-ফিল্ড ইনডেক্স এবং অ্যারে ফিল্ডের জন্য একটি অ্যারে-ধারণকারী একক-ফিল্ড ইনডেক্স আপডেট করে। নিম্নলিখিত সারণির প্রতিটি সারি একটি একক-ফিল্ড ইনডেক্সের একটি এন্ট্রিকে প্রতিনিধিত্ব করে:
| সংগ্রহ | ক্ষেত্র সূচীবদ্ধ | কোয়েরি স্কোপ |
|---|---|---|
| শহরগুলি | name | সংগ্রহ |
| শহরগুলি | অবস্থা | সংগ্রহ |
| শহরগুলি | দেশ | সংগ্রহ |
| শহরগুলি | 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"])
ম্যানুয়াল ইনডেক্স দ্বারা সমর্থিত কোয়েরি
স্বয়ংক্রিয় একক-ক্ষেত্র ইনডেক্স দ্বারা সমর্থিত নয় এমন যৌগিক কোয়েরি সমর্থন করার জন্য ম্যানুয়াল ইনডেক্স তৈরি করুন। উদাহরণস্বরূপ, নিম্নলিখিত কোয়েরিগুলির জন্য আপনার একটি ম্যানুয়াল ইনডেক্স প্রয়োজন হবে:
ওয়েব
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) এই কোয়েরিগুলোর জন্য নিম্নলিখিত ইনডেক্সটি প্রয়োজন। যেহেতু কোয়েরিটি country ফিল্ডের জন্য একটি ইকুয়ালিটি ক্লজ ( == বা in ) ব্যবহার করে, তাই আপনি এই ফিল্ডের জন্য অ্যাসেন্ডিং বা ডিসেন্ডিং ইনডেক্স মোড ব্যবহার করতে পারেন। ডিফল্টরূপে, ইনইকুয়ালিটি ক্লজগুলো, ক্লজে থাকা ফিল্ডের উপর ভিত্তি করে একটি অ্যাসেন্ডিং সর্ট অর্ডার প্রয়োগ করে।
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| শহরগুলি | (বা ) দেশ, জনসংখ্যা | সংগ্রহ |
একই কোয়েরিগুলো অবরোহী ক্রমে চালানোর জন্য, 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)
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| শহরগুলি | অ্যারে-ট্যাগ ধারণ করে , (বা ) ক্যাপিটাল | সংগ্রহ |
সংগ্রহ গোষ্ঠী সূচক দ্বারা সমর্থিত কোয়েরি
কালেকশন গ্রুপ স্কোপ সহ একটি ইনডেক্স প্রদর্শন করতে, city কিছু ডকুমেন্টে একটি landmarks সাব-কালেকশন যোগ করুন:
ওয়েব
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
- পাড়া-মহল্লা বর্ণনা
- তাপমাত্রা ASC
- তাপমাত্রা DESC
- তাপমাত্রা। গ্রীষ্মকালীন ASC
- তাপমাত্রা। গ্রীষ্মকাল বর্ণনা
- তাপমাত্রা। শীতকালীন ASC
- তাপমাত্রা।শীতকাল বর্ণনা
- এলাকা অ্যারেতে রয়েছে
ম্যানুয়াল সূচক
- শহরের নাম ASC, এলাকা ARRAY
- শহরের নাম বর্ণনা, এলাকাসমূহ অ্যারে
সূচীভুক্ত এন্ট্রি
এই ইনডেক্সিং কনফিগারেশনের ফলে ডকুমেন্টটির জন্য নিম্নলিখিত ইনডেক্স এন্ট্রিগুলো তৈরি হয়:
| সূচী | সূচীকৃত ডেটা |
|---|---|
| স্বয়ংক্রিয় সূচক এন্ট্রি | |
| শহরের নাম ASC | শহরের নাম: "সান ফ্রান্সিসকো" |
| শহরের নাম বর্ণনা | শহরের নাম: "সান ফ্রান্সিসকো" |
| পাড়া ASC | এলাকাসমূহ: ["মিশন", "ডাউনটাউন", "মেরিনা"] |
| পাড়া-মহল্লা বর্ণনা | এলাকাসমূহ: ["মিশন", "ডাউনটাউন", "মেরিনা"] |
| তাপমাত্রা ASC | তাপমাত্রা: {গ্রীষ্মকাল: ৬৭, শীতকাল: ৫৫} |
| তাপমাত্রা DESC | তাপমাত্রা: {গ্রীষ্মকাল: ৬৭, শীতকাল: ৫৫} |
| তাপমাত্রা। গ্রীষ্মকালীন ASC | গ্রীষ্মকালে তাপমাত্রা: ৬৭ |
| তাপমাত্রা। গ্রীষ্মকাল বর্ণনা | গ্রীষ্মকালে তাপমাত্রা: ৬৭ |
| তাপমাত্রা। শীতকালীন ASC | শীতকালে তাপমাত্রা: ৫৫ |
| তাপমাত্রা।শীতকাল বর্ণনা | শীতকালে তাপমাত্রা: ৫৫ |
| এলাকা অ্যারেতে রয়েছে | এলাকাসমূহ: "মিশন" |
| এলাকা অ্যারেতে রয়েছে | এলাকা: "ডাউনটাউন" |
| এলাকা অ্যারেতে রয়েছে | এলাকা: "মেরিনা" |
| ম্যানুয়াল সূচী এন্ট্রি | |
| শহরের নাম ASC, এলাকা ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", এলাকা: "মিশন" |
| শহরের নাম ASC, এলাকা ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", এলাকা: "ডাউনটাউন" |
| শহরের নাম ASC, এলাকা 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 ইকুয়ালিটি ক্লজের জন্য ইনডেক্স মার্জ করার ক্ষমতাকে কাজে লাগিয়ে ইনডেক্সের সংখ্যা কমাতে পারেন:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| রেস্তোরাঁ | বিভাগ, | সংগ্রহ |
| রেস্তোরাঁ | শহর, | সংগ্রহ |
| রেস্তোরাঁ | editors_pick, star_rating | সংগ্রহ |
এই ইনডেক্স সেটটি শুধু আকারে ছোটই নয়, এটি একটি অতিরিক্ত কোয়েরিও সমর্থন করে:
ওয়েব
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")সূচীকরণের সীমা
সূচকগুলির ক্ষেত্রে নিম্নলিখিত সীমাগুলি প্রযোজ্য। কোটা ও সীমা সম্পর্কে আরও তথ্যের জন্য, ‘কোটা ও সীমা’ দেখুন।
| সীমা | বিস্তারিত |
|---|---|
| একটি ডাটাবেসের জন্য যৌগিক সূচকের সর্বোচ্চ সংখ্যা |
|
| একটি ডাটাবেসের জন্য একক-ক্ষেত্র কনফিগারেশনের সর্বাধিক সংখ্যা |
একটি ফিল্ড লেভেল কনফিগারেশনে একই ফিল্ডের জন্য একাধিক কনফিগারেশন থাকতে পারে। উদাহরণস্বরূপ, একই ফিল্ডের উপর একটি একক-ফিল্ড ইনডেক্সিং ছাড় এবং একটি TTL পলিসি সীমার ক্ষেত্রে একটি ফিল্ড কনফিগারেশন হিসাবে গণ্য হয়। |
প্রতিটি নথির জন্য সূচী এন্ট্রির সর্বোচ্চ সংখ্যা | ৪০,০০০ একটি ডকুমেন্টের জন্য সূচীভুক্তির সংখ্যা হলো নিম্নলিখিতগুলির যোগফল:
Cloud Firestore কীভাবে একটি ডকুমেন্ট এবং এক সেট ইনডেক্সকে ইনডেক্স এন্ট্রিতে পরিণত করে তা দেখতে, এই ইনডেক্স এন্ট্রি গণনার উদাহরণটি দেখুন। |
| একটি যৌগিক সূচকে ক্ষেত্রের সর্বাধিক সংখ্যা | ১০০ |
| সূচীভুক্তির সর্বোচ্চ আকার | ৭.৫ কিলোবাইট Cloud Firestore কীভাবে ইনডেক্স এন্ট্রি সাইজ গণনা করে তা দেখতে, ইনডেক্স এন্ট্রি সাইজ দেখুন। |
| একটি ডকুমেন্টের সূচীভুক্ত ভুক্তিগুলোর আকারের সর্বোচ্চ যোগফল | ৮ এমআইবি একটি ডকুমেন্টের মোট আকার হলো নিম্নলিখিত বিষয়গুলোর যোগফল: |
| একটি ইনডেক্সড ফিল্ড মানের সর্বোচ্চ আকার | ১৫০০ বাইট ১৫০০ বাইটের বেশি দৈর্ঘ্যের ফিল্ড ভ্যালুগুলো সংক্ষিপ্ত করা হয়। সংক্ষিপ্ত ফিল্ড ভ্যালু ব্যবহার করে করা কোয়েরিগুলো অসামঞ্জস্যপূর্ণ ফলাফল দিতে পারে। |
সূচীকরণের সর্বোত্তম অনুশীলন
বেশিরভাগ অ্যাপের ক্ষেত্রে, আপনার ইনডেক্সগুলো পরিচালনা করার জন্য আপনি স্বয়ংক্রিয় ইনডেক্সিং এবং এরর মেসেজ লিঙ্কগুলোর উপর নির্ভর করতে পারেন। তবে, নিম্নলিখিত ক্ষেত্রগুলোতে আপনি স্বয়ংক্রিয় ইনডেক্সিং থেকে অব্যাহতি যোগ করতে চাইতে পারেন:
| মামলা | বর্ণনা |
|---|---|
| বৃহৎ স্ট্রিং ক্ষেত্র | আপনার যদি এমন কোনো স্ট্রিং ফিল্ড থাকে যেখানে প্রায়শই দীর্ঘ স্ট্রিং ভ্যালু থাকে যা আপনি কোয়েরির জন্য ব্যবহার করেন না, তাহলে সেই ফিল্ডটিকে ইনডেক্সিং থেকে অব্যাহতি দিয়ে আপনি স্টোরেজ খরচ কমাতে পারেন। |
| ক্রমিক মানযুক্ত নথি ধারণকারী একটি সংগ্রহে উচ্চ লেখার হার | যদি আপনি কোনো কালেকশনের এমন কোনো ফিল্ডকে ইনডেক্স করেন যার মান ডকুমেন্টগুলোর মধ্যে ক্রমানুসারে বাড়ে বা কমে, যেমন টাইমস্ট্যাম্প, তাহলে কালেকশনটিতে সর্বোচ্চ রাইট রেট হবে প্রতি সেকেন্ডে ৫০০ বার। যদি আপনি ক্রমানুসারে মান থাকা ফিল্ডটির উপর ভিত্তি করে কোয়েরি না করেন, তাহলে এই সীমাবদ্ধতা এড়ানোর জন্য আপনি ফিল্ডটিকে ইনডেক্সিং থেকে অব্যাহতি দিতে পারেন। উচ্চ রাইট রেটযুক্ত কোনো IoT ব্যবহারের ক্ষেত্রে, উদাহরণস্বরূপ, টাইমস্ট্যাম্প ফিল্ডসহ ডকুমেন্ট ধারণকারী একটি কালেকশন প্রতি সেকেন্ডে ৫০০ রাইটের সীমার কাছাকাছি পৌঁছে যেতে পারে। |
| টিটিএল ক্ষেত্রগুলি | আপনি যদি টিটিএল (টাইম-টু-লিভ) পলিসি ব্যবহার করেন, তবে মনে রাখবেন যে টিটিএল ফিল্ডটি অবশ্যই একটি টাইমস্ট্যাম্প হতে হবে। টিটিএল ফিল্ডগুলিতে ইনডেক্সিং ডিফল্টরূপে সক্রিয় থাকে এবং উচ্চ ট্র্যাফিকের হারে এটি পারফরম্যান্সকে প্রভাবিত করতে পারে। একটি উত্তম অনুশীলন হিসেবে, আপনার টিটিএল ফিল্ডগুলির জন্য স্বয়ংক্রিয় ইনডেক্সিং ছাড় যোগ করুন। |
| বৃহৎ অ্যারে বা মানচিত্র ক্ষেত্র | বড় অ্যারে বা ম্যাপ ফিল্ডে প্রতি ডকুমেন্টে প্রায় ৪০,০০০ ইনডেক্স এন্ট্রির সীমা পর্যন্ত পৌঁছাতে পারে। আপনি যদি কোনো বড় অ্যারে বা ম্যাপ ফিল্ডের উপর ভিত্তি করে কোয়েরি না করেন, তবে সেটিকে ইনডেক্সিং থেকে অব্যাহতি দেওয়া উচিত। |
আপনি যদি একাধিক ফিল্ডে রেঞ্জ এবং ইনইকুয়ালিটি অপারেটরসহ কোয়েরি ব্যবহার করেন, তাহলে Cloud Firestore কোয়েরির পারফরম্যান্স ও খরচ অপ্টিমাইজ করার জন্য যে ইনডেক্সিং বিষয়গুলো বিবেচনা করা উচিত, সেগুলো দেখুন।
ইনডেক্সিং সংক্রান্ত সমস্যা (ইনডেক্স ফ্যানআউট, INVALID_ARGUMENT ত্রুটি) সমাধানের উপায় সম্পর্কে আরও তথ্যের জন্য ট্রাবলশুটিং পৃষ্ঠাটি দেখুন।
একটি ডাটাবেসের কার্যকারিতার ক্ষেত্রে ইনডেক্স একটি গুরুত্বপূর্ণ উপাদান। অনেকটা একটি বইয়ের সূচিপত্রের মতো, যা বইয়ের বিষয়বস্তুকে পৃষ্ঠা নম্বরের সাথে সংযুক্ত করে, একটি ডাটাবেস ইনডেক্স ডাটাবেসের আইটেমগুলোকে তাদের অবস্থানের সাথে সংযুক্ত করে। আপনি যখন একটি ডাটাবেসে কোয়েরি করেন, তখন ডাটাবেসটি আপনার অনুরোধ করা আইটেমগুলোর অবস্থান দ্রুত শনাক্ত করতে ইনডেক্স ব্যবহার করতে পারে।
এই পৃষ্ঠায় Cloud Firestore দ্বারা ব্যবহৃত দুই ধরনের ইনডেক্স— স্বয়ংক্রিয় ইনডেক্স এবং ম্যানুয়াল ইনডেক্স— সম্পর্কে বর্ণনা করা হয়েছে।
সূচকের সংজ্ঞা এবং কাঠামো
একটি প্রদত্ত ডকুমেন্টের ফিল্ডগুলোর তালিকার উপর ভিত্তি করে একটি ইনডেক্স সংজ্ঞায়িত করা হয়, যেখানে প্রতিটি ফিল্ডের জন্য একটি সংশ্লিষ্ট ইনডেক্স মোড থাকে।
একটি ইনডেক্সে, ইনডেক্স ডেফিনিশনে উল্লেখিত প্রতিটি ফিল্ডের জন্য একটি করে এন্ট্রি থাকে। ইনডেক্সের উপর ভিত্তি করে করা কোয়েরির সম্ভাব্য ফলাফল হিসেবে বিবেচিত সমস্ত ডকুমেন্ট এই ইনডেক্সে অন্তর্ভুক্ত থাকে। একটি ডকুমেন্ট তখনই ইনডেক্সে অন্তর্ভুক্ত হয়, যখন ইনডেক্সে ব্যবহৃত প্রতিটি ফিল্ডের জন্য সেটির একটি ইনডেক্সড ভ্যালু সেট করা থাকে। যদি ইনডেক্স ডেফিনিশনে এমন কোনো ফিল্ডের উল্লেখ থাকে যার জন্য ডকুমেন্টটিতে কোনো ভ্যালু সেট করা নেই, তবে সেই ডকুমেন্টটি ইনডেক্সে প্রদর্শিত হবে না। এই ক্ষেত্রে, ইনডেক্সের উপর ভিত্তি করে করা কোনো কোয়েরির ফলাফল হিসেবে ডকুমেন্টটি কখনোই ফেরত আসবে না।
ইনডেক্সটি ফিল্ডের মান অনুসারে, ইনডেক্স সংজ্ঞায় নির্দিষ্ট করা ক্রমানুসারে সাজানো হয়।
প্রতিটি কোয়েরির পিছনে একটি ইনডেক্স থাকে
কোনো কোয়েরির জন্য যদি ইনডেক্স না থাকে, তবে বেশিরভাগ ডেটাবেস তার কন্টেন্টের মধ্যে একটি একটি করে আইটেম খুঁজে বের করে, যা একটি ধীর প্রক্রিয়া এবং ডেটাবেসের আকার বাড়ার সাথে সাথে এই গতি আরও কমে যায়। Cloud Firestore সমস্ত কোয়েরির জন্য ইনডেক্স ব্যবহার করে উচ্চ কোয়েরি পারফরম্যান্স প্রদানে সহায়তা করে। ফলে, কোয়েরির পারফরম্যান্স ডেটাবেসের আইটেমের সংখ্যার উপর নয়, বরং রেজাল্ট সেটের আকারের উপর নির্ভর করে।
ইনডেক্স ব্যবস্থাপনা কম, অ্যাপ ডেভেলপমেন্ট বেশি
Cloud Firestore এমন কিছু ফিচার রয়েছে যা ইনডেক্স ব্যবস্থাপনার জন্য আপনার প্রয়োজনীয় সময় কমিয়ে দেয়। সবচেয়ে সাধারণ কোয়েরিগুলোর জন্য প্রয়োজনীয় ইনডেক্সগুলো আপনার জন্য স্বয়ংক্রিয়ভাবে তৈরি হয়ে যায়। আপনি যখন আপনার অ্যাপ ব্যবহার ও পরীক্ষা করেন, তখন Cloud Firestore আপনার অ্যাপের জন্য প্রয়োজনীয় অতিরিক্ত ইনডেক্সগুলো শনাক্ত করতে ও তৈরি করতে সাহায্য করে।
সূচকের প্রকারভেদ
Cloud Firestore দুই ধরনের ইনডেক্স ব্যবহার করে: অটোমেটিক এবং ম্যানুয়াল । ম্যানুয়াল এবং অটোমেটিক ইনডেক্সের ব্যবস্থাপনার মধ্যে পার্থক্য রয়েছে।
স্বয়ংক্রিয় সূচক
ডিফল্টরূপে, Cloud Firestore একটি কালেকশনের ডকুমেন্টগুলোতে উপস্থিত প্রতিটি ফিল্ডের জন্য স্বয়ংক্রিয়ভাবে ইনডেক্স তৈরি করে। এই একক-ফিল্ড ইনডেক্সগুলো আপনাকে অনেক মৌলিক কোয়েরি সম্পাদন করতে দেয়। আপনি আপনার ডাটাবেসের স্বয়ংক্রিয় ইনডেক্সিং সেটিংস এবং ইনডেক্স ছাড় কনফিগার করার মাধ্যমে স্বয়ংক্রিয় ইনডেক্সগুলো পরিচালনা করেন।
স্বয়ংক্রিয় সূচক ডিফল্ট
Cloud Firestore স্বয়ংক্রিয় ইনডেক্সের জন্য নিম্নলিখিত ডিফল্ট সেটিংস ব্যবহার করে:
প্রতিটি নন-অ্যারে এবং নন-ম্যাপ ফিল্ডের জন্য, Cloud Firestore দুটি কালেকশন-স্কোপ ইনডেক্স সংজ্ঞায়িত করে, একটি অ্যাসেন্ডিং মোডে এবং অন্যটি ডিসেন্ডিং মোডে।
প্রতিটি ম্যাপ ফিল্ডের জন্য, Cloud Firestore নিম্নলিখিতগুলি তৈরি করে:
- প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি করে কালেকশন-স্কোপ ঊর্ধ্বক্রমিক ইনডেক্স।
- প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি করে কালেকশন-স্কোপের অবরোহী সূচক।
- সম্পূর্ণ ম্যাপ মানের জন্য একটি সংগ্রহ-পরিসরের আরোহী সূচক।
- সম্পূর্ণ ম্যাপ মানের জন্য একটি সংগ্রহ-পরিসরের অবরোহী সূচক।
- একটি কালেকশন-স্কোপ অ্যারেতে প্রতিটি অ্যারে সাবফিল্ডের জন্য ইনডেক্স থাকে।
- Cloud Firestore পুনরাবৃত্তিমূলকভাবে প্রতিটি ম্যাপ সাবফিল্ডকে সূচীবদ্ধ করে।
একটি ডকুমেন্টের প্রতিটি অ্যারে ফিল্ডের জন্য, Cloud Firestore নিম্নলিখিত বিষয়গুলো তৈরি করে:
- সম্পূর্ণ অ্যারের মানটির জন্য একটি সংগ্রহ-পরিসরের আরোহী সূচক।
- সম্পূর্ণ অ্যারের মানের জন্য একটি সংগ্রহ-পরিসরের অবরোহী সূচক।
- একটি কালেকশন-স্কোপ অ্যারে-ইনডেক্স ধারণ করে।
কালেকশন গ্রুপ স্কোপের স্বয়ংক্রিয় ইনডেক্সগুলো ডিফল্টরূপে রক্ষণাবেক্ষণ করা হয় না।
স্বয়ংক্রিয় সূচক ছাড়
আপনি একটি ইনডেক্সিং এক্সেমশন তৈরি করে আপনার অটোমেটিক ইনডেক্সিং সেটিংস থেকে কোনো ফিল্ডকে অব্যাহতি দিতে পারেন। একটি ইনডেক্সিং এক্সেমশন ডাটাবেস-ব্যাপী অটোমেটিক ইনডেক্স সেটিংসকে ওভাররাইড করে। একটি এক্সেমশন এমন একটি ইনডেক্সকে সক্রিয় করতে পারে যা আপনার অটোমেটিক ইনডেক্সিং সেটিংস অন্যথায় নিষ্ক্রিয় করে দিত, অথবা এমন একটি ইনডেক্সকে নিষ্ক্রিয় করতে পারে যা অটোমেটিক ইনডেক্সিং অন্যথায় সক্রিয় করত। যেসব ক্ষেত্রে এক্সেমশন কার্যকর হতে পারে, তার জন্য ইনডেক্সিং বেস্ট প্র্যাকটিসেস দেখুন।
একটি কালেকশন গ্রুপের সমস্ত ফিল্ডে কালেকশন-স্তরের ইনডেক্স ছাড় যোগ করতে * ফিল্ড পাথ ভ্যালুটি ব্যবহার করুন। উদাহরণস্বরূপ, comments কালেকশন গ্রুপের জন্য, ‘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__ | সংগ্রহ |
| শহরগুলি | state, __name__ | সংগ্রহ |
| শহরগুলি | country, population, __name__ | সংগ্রহ |
ডিফল্ট __name__ দিক ছাড়া অন্য কোনো দিক অনুযায়ী ফলাফল সাজাতে হলে, আপনাকে সেই ইনডেক্সটি তৈরি করতে হবে।
সূচক বৈশিষ্ট্য
যে ইনডেক্স কোয়েরিটিকে সবচেয়ে দক্ষতার সাথে সম্পাদন করতে সাহায্য করে, তা নিম্নলিখিত বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়:
- সমতা ফিল্টারে ব্যবহৃত ক্ষেত্রগুলি
- সাজানোর ক্রমে ব্যবহৃত ক্ষেত্রগুলি
- রেঞ্জ এবং অসমতা ফিল্টারে ব্যবহৃত ফিল্ডসমূহ (যেগুলো ইতিমধ্যে সর্ট অর্ডারে অন্তর্ভুক্ত নয়)
- অ্যাগ্রিগেশনে ব্যবহৃত ফিল্ডসমূহ (যেগুলো ইতিমধ্যে সর্ট অর্ডার এবং রেঞ্জ ও ইনইকুয়ালিটি ফিল্টারে অন্তর্ভুক্ত নয়)
Cloud Firestore কোয়েরির ফলাফল নিম্নরূপে গণনা করে:
- কোয়েরির কালেকশন, ফিল্টার প্রোপার্টি, ফিল্টার অপারেটর এবং সর্ট অর্ডারের সাথে সংশ্লিষ্ট ইনডেক্স শনাক্ত করে।
- এটি সেই ইনডেক্স অবস্থানকে চিহ্নিত করে যেখান থেকে স্ক্যানিং শুরু হয়। শুরুর অবস্থানের আগে কোয়েরির ইকুয়ালিটি ফিল্টারগুলো থাকে এবং এটি প্রথম
orderByফিল্ডের রেঞ্জ ও ইনইকুয়ালিটি ফিল্টার দিয়ে শেষ হয়। - ইনডেক্স স্ক্যান করা শুরু করে এবং সমস্ত ফিল্টার পূরণকারী প্রতিটি ডকুমেন্ট ফেরত পাঠাতে থাকে, যতক্ষণ না স্ক্যানিং প্রক্রিয়াটি নিম্নলিখিত কাজগুলোর মধ্যে একটি সম্পন্ন করে:
- এমন একটি নথি পাওয়া যায় যা ফিল্টারের শর্ত পূরণ করে না এবং নিশ্চিত করে যে পরবর্তী কোনো নথিও আর কখনো ফিল্টারের শর্তগুলো সম্পূর্ণরূপে পূরণ করবে না।
- সূচিপত্রের শেষ প্রান্তে পৌঁছায়।
- কোয়েরি দ্বারা অনুরোধ করা সর্বাধিক সংখ্যক ফলাফল সংগ্রহ করে।
সূচীকরণের উদাহরণ
আপনার জন্য স্বয়ংক্রিয়ভাবে সিঙ্গেল-ফিল্ড ইনডেক্স তৈরি করার মাধ্যমে, Cloud Firestore আপনার অ্যাপ্লিকেশনকে সবচেয়ে মৌলিক ডাটাবেস কোয়েরিগুলো দ্রুত সমর্থন করতে সক্ষম করে। সিঙ্গেল-ফিল্ড ইনডেক্স আপনাকে ফিল্ডের মান এবং < , <= , == , >= , > , ও in কম্প্যারেটরগুলোর উপর ভিত্তি করে সাধারণ কোয়েরি সম্পাদন করতে দেয়। অ্যারে ফিল্ডের ক্ষেত্রে, এগুলো আপনাকে array-contains এবং array-contains-any কোয়েরি সম্পাদন করতে দেয়।
উদাহরণস্বরূপ, ইনডেক্স তৈরির দৃষ্টিকোণ থেকে নিম্নলিখিত উদাহরণগুলো পরীক্ষা করুন। নিচের কোড স্নিপেটটি একটি ' cities কালেকশনে কয়েকটি city ডকুমেন্ট তৈরি করে এবং প্রতিটি ডকুমেন্টের জন্য 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 প্রতিটি ফিল্ডের জন্য একটি আরোহী একক-ফিল্ড ইনডেক্স, একটি অবরোহী একক-ফিল্ড ইনডেক্স এবং অ্যারে ফিল্ডের জন্য একটি অ্যারে-ধারণকারী একক-ফিল্ড ইনডেক্স আপডেট করে। নিম্নলিখিত সারণির প্রতিটি সারি একটি একক-ফিল্ড ইনডেক্সের একটি এন্ট্রিকে প্রতিনিধিত্ব করে:
| সংগ্রহ | ক্ষেত্র সূচীবদ্ধ | কোয়েরি স্কোপ |
|---|---|---|
| শহরগুলি | name | সংগ্রহ |
| শহরগুলি | অবস্থা | সংগ্রহ |
| শহরগুলি | দেশ | সংগ্রহ |
| শহরগুলি | 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) If you need to run a compound query that uses a range comparison ( < , <= , > , or >= ) or if you need to sort by a different field, you must create a manual index for that query.
The array-contains index lets you query the regions array field:
ওয়েব
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"])
Queries supported by manual indexes
Create manual indexes to support compound queries not already supported by automatic single-field indexes. For example, you would need a manual index for the following queries:
ওয়েব
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) These queries require the following index. Since the query uses an equality ( == or in ) for the country field, you can use an ascending or descending index mode for this field. By default, inequality clauses apply an ascending sort order based on the field in the inequality clause.
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| শহরগুলি | (or ) country, population | সংগ্রহ |
To run the same queries but with a descending sort order, you need an additional index in the descending direction for 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")| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| শহরগুলি | country, population | সংগ্রহ |
| শহরগুলি | country , population | সংগ্রহ |
To avoid performance loss caused by index merging , we recommend that you create an index to combine an array-contains or array-contains-any query with additional clauses:
ওয়েব
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 tags, (or ) capital | সংগ্রহ |
Queries supported by collection group indexes
To demonstrate an index with collection group scope, add a landmarks sub-collection to some of the city documents:
ওয়েব
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" });
Using the following single-field index with collection scope, you can query a single city's landmarks collection based on the category field:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| landmarks | (or ) category | সংগ্রহ |
ওয়েব
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"]) If you're interested in querying the landmarks across all cities, for example, you run this query on the collection group that consists of all landmarks collections. You must also enable a landmarks single-field index with collection group scope:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| landmarks | (or ) category | Collection group |
With this index enabled, you can query the landmarks collection group:
ওয়েব
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
To run a collection group query that returns filtered or ordered results, you must enable a corresponding index with collection group scope. Collection group queries that don't filter or order results, however, don't require any additional index definitions.
For example, you can run the following collection group query without enabling an additional index:
ওয়েব
db.collectionGroup("landmarks").get()Index entries
Your project's configured indexes and the structure of a document determine the number of index entries for a document. Index entries count towards the index entry count limit .
The following example demonstrates the index entries of a document.
নথি
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Automatic indexes
- city_name ASC
- city_name DESC
- neighborhoods ASC
- neighborhoods DESC
- temperatures ASC
- temperatures DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains
Manual indexes
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
Index entries
This indexing configuration results in the following index entries for the document:
| সূচী | Indexed data |
|---|---|
| Automatic index entries | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| neighborhoods ASC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| neighborhoods DESC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| temperatures ASC | temperatures: {summer: 67, winter: 55} |
| temperatures DESC | temperatures: {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 |
| neighborhoods Array Contains | neighborhoods: "Mission" |
| neighborhoods Array Contains | neighborhoods: "Downtown" |
| neighborhoods Array Contains | neighborhoods: "Marina" |
| Manual index entries | |
| 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" |
Indexes and pricing
Indexes contribute to the storage costs of your application. For more information about how to calculate storage size for indexes, see Index entry size .
Use index merging
Although Cloud Firestore uses an index for every query, it doesn't necessarily require one index per query. For queries with multiple equality ( == ) clauses and, optionally, an orderBy clause, Cloud Firestore can re-use existing indexes. Cloud Firestore can merge the indexes for simple equality filters to build the indexes needed for larger equality queries.
You can reduce indexing costs by identifying situations where you can use index merging. For example, in a restaurants collection for a restaurant rating app:
restaurants
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
This app uses queries like the following. The app uses combinations of equality clauses for category , city , and editors_pick while always sorting by ascending 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")You could create an index for each query:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| রেস্তোরাঁ | category, star_rating | সংগ্রহ |
| রেস্তোরাঁ | city, star_rating | সংগ্রহ |
| রেস্তোরাঁ | category, city, star_rating | সংগ্রহ |
| রেস্তোরাঁ | category, city, editors_pick, star_rating | সংগ্রহ |
As a better solution, you can reduce the number of indexes by taking advantage of Cloud Firestore 's ability to merge indexes for equality clauses:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্র | কোয়েরি স্কোপ |
|---|---|---|
| রেস্তোরাঁ | category, star_rating | সংগ্রহ |
| রেস্তোরাঁ | city, star_rating | সংগ্রহ |
| রেস্তোরাঁ | editors_pick, star_rating | সংগ্রহ |
Not only is this set of indexes smaller, it also supports an additional query:
ওয়েব
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")Indexing limits
The following limits apply to indexes. For more information about quotas and limits, see Quotas and Limits .
| সীমা | বিস্তারিত |
|---|---|
| Maximum number of composite indexes for a database |
|
| Maximum number of single-field configurations for a database |
One field level configuration can contain multiple configurations for the same field. For example, a single-field indexing exemption and a TTL policy on the same field count as one field configuration towards the limit. |
প্রতিটি নথির জন্য সূচী এন্ট্রির সর্বোচ্চ সংখ্যা | ৪০,০০০ The number of index entries is the sum of the following for a document:
To see how Cloud Firestore turns a document and a set of indexes into index entries, see this index entry count example . |
| Maximum number of fields in a composite index | ১০০ |
| সূচীভুক্তির সর্বোচ্চ আকার | ৭.৫ কিলোবাইট To see how Cloud Firestore calculates index entry size, see index entry size . |
| একটি ডকুমেন্টের সূচীভুক্ত ভুক্তিগুলোর আকারের সর্বোচ্চ যোগফল | ৮ এমআইবি The total size is the sum of the following for a document: |
| Maximum size of an indexed field value | 1500 bytes Field values over 1500 bytes are truncated. Queries involving truncated field values may return inconsistent results. |
Indexing best practices
For most apps, you can rely on automatic indexing and the error message links to manage your indexes. However, you may want to add automatic indexing exemptions in the following cases:
| Case | বর্ণনা |
|---|---|
| Large string fields | If you have a string field that often holds long string values that you don't use for querying, you can cut storage costs by exempting the field from indexing. |
| High write rates to a collection containing documents with sequential values | If you index a field that increases or decreases sequentially between documents in a collection, like a timestamp, then the maximum write rate to the collection is 500 writes per second. If you don't query based on the field with sequential values, you can exempt the field from indexing to bypass this limit. In an IoT use case with a high write rate, for example, a collection containing documents with a timestamp field might approach the 500 writes per second limit. |
| TTL fields | If you use TTL (time-to-live) policies , note that the TTL field must be a timestamp. Indexing on TTL fields is enabled by default and can affect performance at higher traffic rates. As a best practice, add automatic indexing exemptions for your TTL fields. |
| Large array or map fields | Large array or map fields can approach the limit of 40,000 index entries per document. If you are not querying based on a large array or map field, you should exempt it from indexing. |
If you are using queries with range and inequality operators on multiple fields, see the indexing considerations that you should consider to optimize the performance and cost of Cloud Firestore queries.
For more information about how to resolve indexing issues (index fanout, INVALID_ARGUMENT errors) see the troubleshooting page .