ডেটাবেসের পারফর্ম্যান্সের ক্ষেত্রে ইনডেক্স একটি গুরুত্বপূর্ণ ফ্যাক্টর। বইয়ের সূচিপত্র যেমন বইয়ের বিষয়বস্তুকে পৃষ্ঠা নম্বরের সাথে ম্যাপ করে, ঠিক তেমনই ডেটাবেস ইনডেক্স ডেটাবেসের আইটেমগুলিকে ডেটাবেসে তাদের লোকেশনের সাথে ম্যাপ করে। আপনি কোনও ডেটাবেসে কোয়েরি করলে, আপনার অনুরোধ করা আইটেমের লোকেশন দ্রুত শনাক্ত করতে ডেটাবেস একটি ইনডেক্স ব্যবহার করতে পারে।
এই পৃষ্ঠায় 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 এবং array-contains-any কোয়েরি ক্লজ কাজ করে। |
| ভেক্টর | ফিল্ডে FindNearest কোয়েরি ক্লজ কাজ করে। |
কোয়েরির স্কোপ
প্রতিটি ইন্ডেক্স হয় কোনও কালেকশন বা কালেকশন গ্রুপের জন্য স্কোপ করা হয়। এটি ইনডেক্সের কোয়েরি স্কোপ হিসেবে পরিচিত:
- সংগ্রহের সুযোগ
- Cloud Firestore ডিফল্ট হিসেবে কালেকশন স্কোপ সহ ইন্ডেক্স তৈরি করে। এইসব ইন্ডেক্স এমন কোয়েরি সাপোর্ট করে যা একটি সংগ্রহ থেকে ফলাফল দেখায়।
- কালেকশন গ্রুপের স্কোপ
- একটি কালেকশন গ্রুপে একই কালেকশন আইডি সহ সব কালেকশন অন্তর্ভুক্ত থাকে। কালেকশন গ্রুপ কোয়েরি রান করতে, যা কালেকশন গ্রুপ থেকে ফিল্টার করা বা অর্ডার করা ফলাফল ফেরত দেয়, আপনাকে অবশ্যই কালেকশন গ্রুপের স্কোপ সহ একটি সংশ্লিষ্ট ইনডেক্স তৈরি করতে হবে।
ডিফল্ট অর্ডারিং এবং __name__ ফিল্ড
প্রতিটি ফিল্ডের জন্য নির্দিষ্ট করা ইন্ডেক্স মোড (ঊর্ধ্বক্রম বা অধঃক্রম) অনুসারে ডকুমেন্ট সাজানোর পাশাপাশি, ইন্ডেক্স প্রতিটি ডকুমেন্টের __name__ ফিল্ড অনুসারে চূড়ান্ত সাজানোর কাজ করে। __name__
ফিল্ডের মান সম্পূর্ণ ডকুমেন্ট পাথে সেট করা আছে। এর অর্থ হল, একই ফিল্ড ভ্যালু সহ ফলাফল সেটে থাকা ডকুমেন্টগুলি
ডকুমেন্ট পাথ অনুযায়ী সাজানো হয়।
ডিফল্ট হিসেবে, __name__ ফিল্ডটি ইন্ডেক্স সংজ্ঞায় শেষবার সাজানো ফিল্ডের
একই ক্রমে সাজানো হয়। যেমন:
| সংগ্রহ | ইন্ডেক্স করা ফিল্ড | কোয়েরির সুযোগ |
|---|---|---|
| শহর | নাম, __name__ |
সংগ্রহ |
| শহর | রাজ্য, __name__ |
সংগ্রহ |
| শহর | দেশ, জনসংখ্যা, __name__ |
সংগ্রহ |
ডিফল্ট নয় এমন __name__ ডিরেকশন অনুযায়ী ফলাফল সাজাতে, আপনাকে
সেই ইন্ডেক্স তৈরি করতে হবে।
ইন্ডেক্স প্রপার্টি
সবচেয়ে দক্ষতার সাথে কোয়েরি এক্সিকিউট করার অনুমতি দেয় এমন একটি ইন্ডেক্স নিম্নলিখিত প্রপার্টি দ্বারা সংজ্ঞায়িত করা হয়:
- ইকুয়ালিটি ফিল্টারে ব্যবহৃত ফিল্ড
- ক্রমানুসারে সাজানোর সেটিংয়ে ব্যবহার করা ফিল্ড
- রেঞ্জ ও অসমতা ফিল্টারে ব্যবহৃত ফিল্ড (যা আগে থেকে ক্রমানুসারে সাজানোর সেটিংয়ে অন্তর্ভুক্ত করা হয়নি)
- অ্যাগ্রিগেশনে ব্যবহৃত ফিল্ড (যা আগে থেকে ক্রমানুসারে সাজানোর সেটিং এবং রেঞ্জ ও বৈষম্য ফিল্টারে অন্তর্ভুক্ত করা হয়নি)
Cloud Firestore নিম্নলিখিত উপায়ে কোয়েরির ফলাফল গণনা করে:
- কোয়েরির সংগ্রহ, ফিল্টার প্রপার্টি, ফিল্টার অপারেটর ও ক্রমানুসারে সাজানোর সেটিংয়ের সাথে সম্পর্কিত ইন্ডেক্স শনাক্ত করে।
- যে ইনডেক্স পজিশন থেকে স্ক্যানিং শুরু হয় তা শনাক্ত করে। শুরুর
অবস্থানটি কোয়েরির সমতা ফিল্টার দিয়ে শুরু হয় এবং প্রথম
orderByফিল্ডে রেঞ্জ ও অসমতা ফিল্টার দিয়ে শেষ হয়। - ইনডেক্স স্ক্যান করা শুরু করে, প্রতিটি ডকুমেন্ট ফেরত দেয় যা সব ফিল্টার পূরণ করে, যতক্ষণ না স্ক্যানিং প্রসেস নিম্নলিখিতগুলির মধ্যে একটি করে:
- এমন একটি ডকুমেন্ট খুঁজে পায় যা ফিল্টার কন্ডিশন পূরণ করে না এবং কনফার্ম করে যে পরবর্তী কোনও ডকুমেন্ট কখনই ফিল্টার কন্ডিশন সম্পূর্ণভাবে পূরণ করবে না।
- ইনডেক্সের শেষে পৌঁছে যায়।
- কোয়েরির মাধ্যমে অনুরোধ করা ফলাফলের সর্বাধিক সংখ্যা সংগ্রহ করে।
ইনডেক্সিংয়ের উদাহরণ
আপনার জন্য অটোমেটিক সিঙ্গল-ফিল্ড ইনডেক্স তৈরি করার মাধ্যমে, Cloud Firestore
আপনার অ্যাপ্লিকেশনকে সবচেয়ে সাধারণ ডেটাবেস কোয়েরি দ্রুত সাপোর্ট করার অনুমতি দেয়।
সিঙ্গেল-ফিল্ড ইনডেক্স আপনাকে ফিল্ড ভ্যালু এবং তুলনাকারী <, <=, ==, >=, > এবং in-এর উপর ভিত্তি করে সহজ কোয়েরি করার সুবিধা দেয়। অ্যারে ফিল্ডের জন্য,
এগুলি আপনাকে array-contains এবং array-contains-any কোয়েরি পারফর্ম করার অনুমতি দেয়।
উদাহরণস্বরূপ, ইনডেক্স তৈরির দৃষ্টিকোণ থেকে নিম্নলিখিত উদাহরণগুলি পরীক্ষা করুন। নিম্নলিখিত স্নিপেট 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 প্রতিটি ফিল্ডের জন্য একটি ঊর্ধ্বক্রমের সিঙ্গেল-ফিল্ড ইন্ডেক্স, প্রতিটি ফিল্ডের জন্য একটি অধঃক্রমের সিঙ্গেল- ফিল্ড ইন্ডেক্স এবং অ্যারে ফিল্ডের জন্য একটি অ্যারে-কন্টেন সিঙ্গেল-ফিল্ড ইন্ডেক্স আপডেট করে। নিম্নলিখিত টেবিলের প্রতিটি সারি একটি সিঙ্গল-ফিল্ড ইনডেক্সে এন্ট্রিকে দেখায়:
| সংগ্রহ | ফিল্ড ইনডেক্স করা হয়েছে | কোয়েরির সুযোগ |
|---|---|---|
| শহর | নাম | সংগ্রহ |
| শহর | টি রাজ্য | সংগ্রহ |
| শহর | টি দেশ | সংগ্রহ |
| শহর | বড় হাতের অক্ষর | সংগ্রহ |
| শহর | জনসংখ্যা | সংগ্রহ |
| শহর | টি অঞ্চল | সংগ্রহ |
| শহর | নাম | সংগ্রহ |
| শহর | টি রাজ্য | সংগ্রহ |
| শহর | টি দেশ | সংগ্রহ |
| শহর | বড় হাতের অক্ষর | সংগ্রহ |
| শহর | জনসংখ্যা | সংগ্রহ |
| শহর | টি অঞ্চল | সংগ্রহ |
| শহর | 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)
| সংগ্রহ | ইন্ডেক্স করা ফিল্ড | কোয়েরির সুযোগ |
|---|---|---|
| শহর | array-contains ট্যাগ, (অথবা ) ক্যাপিটাল | সংগ্রহ |
কালেকশন গ্রুপ ইন্ডেক্স দ্বারা সমর্থিত কোয়েরি
কালেকশন গ্রুপের স্কোপ সহ ইন্ডেক্স দেখাতে, কিছু 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"]
অটোমেটিক ইন্ডেক্স
- city_name ASC
- city_name DESC
- আশেপাশের এলাকা ASC
- আশেপাশের এলাকা DESC
- তাপমাত্রা ASC
- তাপমাত্রা DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains
ম্যানুয়াল ইন্ডেক্স
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
ইন্ডেক্স এন্ট্রি
এই ইন্ডেক্সিং কনফিগারেশনের ফলে ডকুমেন্টের জন্য নিম্নলিখিত ইন্ডেক্স এন্ট্রি তৈরি হয়:
| সূচি | ইন্ডেক্স করা ডেটা |
|---|---|
| অটোমেটিক ইন্ডেক্স এন্ট্রি | |
| city_name ASC | city_name: "সান ফ্রান্সিসকো" |
| city_name DESC | city_name: "সান ফ্রান্সিসকো" |
| আশেপাশের এলাকা ASC | আশেপাশের এলাকা: ["মিশন", "ডাউনটাউন", "মেরিনা"] |
| আশেপাশের এলাকা DESC | আশেপাশের এলাকা: ["মিশন", "ডাউনটাউন", "মেরিনা"] |
| তাপমাত্রা 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 |
| neighborhoods Array Contains | আশেপাশের এলাকা: "মিশন" |
| neighborhoods Array Contains | আশেপাশের এলাকা: "ডাউনটাউন" |
| neighborhoods Array Contains | আশেপাশের এলাকা: "মেরিনা" |
| ম্যানুয়াল ইন্ডেক্স এন্ট্রি | |
| city_name ASC, neighborhoods ARRAY | city_name: "কলকাতা", neighborhoods: "শ্যামবাজার" |
| city_name ASC, neighborhoods ARRAY | "শহরের_নাম: "কলকাতা", আশেপাশের এলাকা: "ডাউনটাউন" |
| city_name ASC, neighborhoods ARRAY | "সান ফ্রান্সিসকো" শহরের "মেরিনা" এলাকা |
| city_name DESC, neighborhoods ARRAY | city_name: "কলকাতা", neighborhoods: "শ্যামবাজার" |
| city_name DESC, neighborhoods ARRAY | "শহরের_নাম: "কলকাতা", আশেপাশের এলাকা: "ডাউনটাউন" |
| city_name DESC, neighborhoods ARRAY | "সান ফ্রান্সিসকো": city_name, "মেরিনা": neighborhoods |
ইনডেক্স ও মূল্য
আপনার অ্যাপ্লিকেশনের স্টোরেজ খরচে ইনডেক্স অবদান রাখে। ইনডেক্সের জন্য স্টোরেজের সাইজ কীভাবে গণনা করতে হয় সেই সম্পর্কে আরও জানতে, ইনডেক্স এন্ট্রি সাইজ দেখুন।
ইনডেক্স মার্জিং ব্যবহার করুন
যদিও 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")আপনি প্রতিটি কোয়েরির জন্য একটি ইন্ডেক্স তৈরি করতে পারেন:
| সংগ্রহ | ইন্ডেক্স করা ফিল্ড | কোয়েরির সুযোগ |
|---|---|---|
| রেস্তোরাঁ | বিভাগ, star_rating | সংগ্রহ |
| রেস্তোরাঁ | শহর, star_rating | সংগ্রহ |
| রেস্তোরাঁ | বিভাগ, শহর, star_rating | সংগ্রহ |
| রেস্তোরাঁ | বিভাগ, শহর, editors_pick, star_rating | সংগ্রহ |
আরও ভালো সমাধান হিসেবে, আপনি Cloud Firestore-এর ইকুয়ালিটি ক্লজের জন্য ইনডেক্স মার্জ করার সুবিধা ব্যবহার করে ইনডেক্সের সংখ্যা কমাতে পারেন:
| সংগ্রহ | ইন্ডেক্স করা ফিল্ড | কোয়েরির সুযোগ |
|---|---|---|
| রেস্তোরাঁ | বিভাগ, star_rating | সংগ্রহ |
| রেস্তোরাঁ | শহর, star_rating | সংগ্রহ |
| রেস্তোরাঁ | editors_pick, star_rating | সংগ্রহ |
এই ইন্ডেক্সের সেটটি শুধু ছোটই নয়, এটি অতিরিক্ত কোয়েরিও সাপোর্ট করে:
ওয়েব
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")ইনডেক্সিংয়ের সীমা
ইনডেক্সের ক্ষেত্রে নিম্নলিখিত সীমা প্রযোজ্য। কোটা ও সীমা সম্পর্কে আরও তথ্য পেতে, কোটা ও সীমা দেখুন।
| সীমা | বিবরণ |
|---|---|
| একটি ডেটাবেসের জন্য কম্পোজিট ইনডেক্সের সর্বাধিক সংখ্যা |
|
| একটি ডেটাবেসের জন্য সর্বাধিক সংখ্যক সিঙ্গল-ফিল্ড কনফিগারেশন |
একটি ফিল্ড লেভেল কনফিগারেশনে একই ফিল্ডের জন্য একাধিক কনফিগারেশন থাকতে পারে। যেমন, একই ফিল্ডে একটি সিঙ্গল-ফিল্ড ইন্ডেক্সিং ছাড় এবং একটি TTL নীতি সীমার মধ্যে একটি ফিল্ড কনফিগারেশন হিসেবে গণনা করা হয়। |
|
প্রতিটি ডকুমেন্টের জন্য সর্বাধিক সংখ্যক ইন্ডেক্স এন্ট্রি |
৪০,০০০ কোনও ডকুমেন্টের জন্য ইন্ডেক্স এন্ট্রির সংখ্যা হল নিম্নলিখিতগুলির যোগফল:
Cloud Firestore কীভাবে একটি ডকুমেন্ট এবং ইন্ডেক্সের সেটকে ইন্ডেক্স এন্ট্রিতে পরিণত করে তা দেখতে, এই ইন্ডেক্স এন্ট্রি গণনা করার উদাহরণ দেখুন। |
| কম্পোজিট ইন্ডেক্সে ফিল্ডের সর্বাধিক সংখ্যা | ১০০ |
| ইনডেক্স এন্ট্রির সর্বাধিক সাইজ |
৭.৫ কিবিবাইট Cloud Firestore কীভাবে ইন্ডেক্স এন্ট্রি সাইজ গণনা করে তা দেখতে, ইন্ডেক্স এন্ট্রি সাইজ দেখুন। |
| ডকুমেন্টের ইন্ডেক্স এন্ট্রির সাইজের সর্বাধিক যোগফল |
৮ MiB মোট সাইজ হল কোনও ডকুমেন্টের জন্য নিম্নলিখিতগুলির যোগফল: |
| ইনডেক্স করা ফিল্ডের ভ্যালুর সর্বাধিক সাইজ |
১৫০০ বাইট ১৫০০ বাইটের বেশি ফিল্ড ভ্যালু ট্রাঙ্কেট করা হয়। ট্রাঙ্কেট করা ফিল্ড ভ্যালু সহ কোয়েরি অসামঞ্জস্যপূর্ণ ফলাফল দেখাতে পারে। |
ইনডেক্সিং সংক্রান্ত পেশাদার পদ্ধতি
বেশিরভাগ অ্যাপের ক্ষেত্রে, আপনি অটোমেটিক ইন্ডেক্সিং এবং ত্রুটি মেসেজের লিঙ্কের উপর নির্ভর করতে পারেন আপনার ইন্ডেক্স ম্যানেজ করতে। তবে, নিম্নলিখিত ক্ষেত্রে আপনি অটোমেটিক ইন্ডেক্সিংয়ের ছাড় যোগ করতে চাইতে পারেন:
| কারক | বিবরণ |
|---|---|
| বড় স্ট্রিং ফিল্ড | আপনার যদি এমন একটি স্ট্রিং ফিল্ড থাকে যা প্রায়শই দীর্ঘ স্ট্রিং ভ্যালু ধারণ করে যা আপনি কোয়েরি করার জন্য ব্যবহার করেন না, তাহলে আপনি ফিল্ডটিকে ইনডেক্সিং থেকে অব্যাহতি দিয়ে স্টোরেজ খরচ কমাতে পারেন। |
| সিকোয়েন্সিয়াল ভ্যালু সহ ডকুমেন্ট আছে এমন কালেকশনে হাই রাইট রেট | আপনি যদি এমন কোনও ফিল্ড ইন্ডেক্স করেন যা কোনও কালেকশনের ডকুমেন্টের মধ্যে ক্রমানুসারে বাড়ে বা কমে, যেমন টাইমস্ট্যাম্প, তাহলে কালেকশনে লেখার সর্বোচ্চ হার হল প্রতি সেকেন্ডে ৫০০টি লেখা। আপনি যদি ক্রমিক মান সহ ফিল্ডের উপর ভিত্তি করে কোয়েরি না করেন, তাহলে এই সীমা এড়াতে আপনি ইন্ডেক্সিং থেকে ফিল্ডটি ছাড় দিতে পারেন। IoT ব্যবহারের ক্ষেত্রে যেখানে রাইট রেট বেশি, যেমন, টাইমস্ট্যাম্প ফিল্ড সহ ডকুমেন্ট আছে এমন কালেকশন প্রতি সেকেন্ডে ৫০০ বার লেখার সীমার কাছাকাছি পৌঁছে যেতে পারে। |
| TTL ফিল্ড |
আপনি TTL (টাইম-টু-লাইভ) নীতি ব্যবহার করলে, মনে রাখবেন যে TTL ফিল্ডে অবশ্যই টাইমস্ট্যাম্প থাকতে হবে। TTL ফিল্ডে ইন্ডেক্সিং ডিফল্ট হিসেবে চালু করা থাকে এবং ট্রাফিক রেট বেশি হলে পারফর্ম্যান্সের উপর প্রভাব ফেলতে পারে। পেশাদার পদ্ধতি হিসেবে, আপনার TTL ফিল্ডের জন্য অটোমেটিক ইন্ডেক্সিং সংক্রান্ত ছাড় যোগ করুন। |
| বড় অ্যারে বা ম্যাপ ফিল্ড | বড় অ্যারে বা ম্যাপ ফিল্ড ডকুমেন্ট প্রতি ৪০,০০০ ইন্ডেক্স এন্ট্রির সীমায় পৌঁছাতে পারে। আপনি যদি বড় অ্যারে বা ম্যাপ ফিল্ডের উপর ভিত্তি করে কোয়েরি না করেন, তাহলে ইন্ডেক্সিং থেকে এটি বাদ দেওয়া উচিত। |
আপনি যদি একাধিক ফিল্ডে রেঞ্জ এবং ইনইকুয়ালিটি অপারেটর সহ কোয়েরি ব্যবহার করেন, তাহলে Cloud Firestore কোয়েরির পারফর্ম্যান্স এবং খরচ অপ্টিমাইজ করার জন্য আপনাকে যে ইনডেক্সিং সংক্রান্ত বিষয় বিবেচনা করতে হবে তা দেখুন।
ইন্ডেক্সিং সংক্রান্ত সমস্যা (ইন্ডেক্স ফ্যানআউট, INVALID_ARGUMENT সমস্যা) কীভাবে সমাধান করবেন সেই সম্পর্কে আরও তথ্য পেতে, সমস্যার সমাধানকরণ পৃষ্ঠা দেখুন।