একটি ডাটাবেসের কর্মক্ষমতার ক্ষেত্রে সূচী একটি গুরুত্বপূর্ণ বিষয়। একটি বইয়ের সূচীর মতো, যা একটি বইয়ের বিষয়গুলিকে পৃষ্ঠা সংখ্যার সাথে ম্যাপ করে, একটি ডাটাবেস সূচী একটি ডাটাবেসের আইটেমগুলিকে ডাটাবেসের মধ্যে তাদের অবস্থানের সাথে ম্যাপ করে। যখন আপনি একটি ডাটাবেস অনুসন্ধান করেন, তখন ডাটাবেস আপনার অনুরোধ করা আইটেমগুলির অবস্থান দ্রুত সনাক্ত করতে একটি সূচী ব্যবহার করতে পারে।
এই পৃষ্ঠাটি Cloud Firestore যে দুই ধরণের সূচক ব্যবহার করে তা বর্ণনা করে, একক-ক্ষেত্র সূচক এবং যৌগিক সূচক ।
সূচকের সংজ্ঞা এবং গঠন
একটি সূচক একটি প্রদত্ত নথির ক্ষেত্রের তালিকার উপর সংজ্ঞায়িত করা হয়, প্রতিটি ক্ষেত্রের জন্য একটি সংশ্লিষ্ট সূচক মোড সহ।
একটি সূচীতে সূচী সংজ্ঞায় উল্লেখিত প্রতিটি ক্ষেত্রের জন্য একটি এন্ট্রি থাকে। সূচীতে সেই সমস্ত নথি অন্তর্ভুক্ত থাকে যা সূচীর উপর ভিত্তি করে প্রশ্নের সম্ভাব্য ফলাফল। একটি নথি কেবল তখনই সূচীতে অন্তর্ভুক্ত হয় যদি সূচীতে ব্যবহৃত প্রতিটি ক্ষেত্রের জন্য একটি সূচীকৃত মান সেট থাকে। যদি সূচী সংজ্ঞা এমন একটি ক্ষেত্রকে নির্দেশ করে যার জন্য নথিতে কোনও মান সেট নেই, তাহলে সেই নথিটি সূচীতে প্রদর্শিত হবে না। এই ক্ষেত্রে, সূচীর উপর ভিত্তি করে কোনও প্রশ্নের ফলাফল হিসাবে নথিটি কখনই ফেরত পাঠানো হবে না।
কম্পোজিট সূচকটি ক্ষেত্র মান অনুসারে সাজানো হয়, সূচক সংজ্ঞায় নির্দিষ্ট ক্রমে।
প্রতিটি প্রশ্নের পিছনে একটি সূচক
যদি কোনও কোয়েরির জন্য কোনও সূচী না থাকে, তাহলে বেশিরভাগ ডাটাবেস তাদের বিষয়বস্তু আইটেম অনুসারে ক্রল করে, একটি ধীর প্রক্রিয়া যা ডাটাবেস বৃদ্ধির সাথে সাথে আরও ধীর হয়ে যায়। Cloud Firestore সমস্ত কোয়েরির জন্য সূচী ব্যবহার করে উচ্চ কোয়েরি কর্মক্ষমতা নিশ্চিত করে। ফলস্বরূপ, কোয়েরি কর্মক্ষমতা ডাটাবেসে আইটেমের সংখ্যার উপর নয় বরং ফলাফল সেটের আকারের উপর নির্ভর করে।
কম সূচক ব্যবস্থাপনা, বেশি অ্যাপ ডেভেলপমেন্ট
Cloud Firestore এমন বৈশিষ্ট্য রয়েছে যা সূচক ব্যবস্থাপনায় আপনার ব্যয় করা সময় কমিয়ে দেয়। সবচেয়ে মৌলিক প্রশ্নের জন্য প্রয়োজনীয় সূচকগুলি স্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি হয়। আপনি যখন আপনার অ্যাপ ব্যবহার এবং পরীক্ষা করেন, তখন Cloud Firestore আপনাকে আপনার অ্যাপের জন্য প্রয়োজনীয় অতিরিক্ত সূচকগুলি সনাক্ত করতে এবং তৈরি করতে সহায়তা করে।
সূচকের ধরণ
Cloud Firestore দুই ধরণের সূচক ব্যবহার করে: একক-ক্ষেত্র এবং কম্পোজিট । সূচীকৃত ক্ষেত্রের সংখ্যা ছাড়াও, একক-ক্ষেত্র এবং কম্পোজিট সূচকগুলি আপনি কীভাবে পরিচালনা করেন তার উপর নির্ভর করে।
একক-ক্ষেত্র সূচক
একটি একক-ক্ষেত্র সূচক একটি সংগ্রহের সমস্ত নথির একটি সাজানো ম্যাপিং সংরক্ষণ করে যেখানে একটি নির্দিষ্ট ক্ষেত্র থাকে। একটি একক-ক্ষেত্র সূচকের প্রতিটি এন্ট্রি একটি নির্দিষ্ট ক্ষেত্রের জন্য একটি নথির মান এবং ডাটাবেসে নথির অবস্থান রেকর্ড করে। Cloud Firestore অনেক মৌলিক প্রশ্ন সম্পাদন করতে এই সূচকগুলি ব্যবহার করে। আপনি আপনার ডাটাবেসের স্বয়ংক্রিয় সূচীকরণ সেটিংস এবং সূচীকরণ ছাড়গুলি কনফিগার করে একক-ক্ষেত্র সূচকগুলি পরিচালনা করেন।
স্বয়ংক্রিয় সূচীকরণ
ডিফল্টরূপে, Cloud Firestore স্বয়ংক্রিয়ভাবে একটি ডকুমেন্টের প্রতিটি ফিল্ডের জন্য এবং একটি ম্যাপের প্রতিটি সাবফিল্ডের জন্য একক-ক্ষেত্র সূচক বজায় রাখে। Cloud Firestore একক-ক্ষেত্র সূচকের জন্য নিম্নলিখিত ডিফল্ট সেটিংস ব্যবহার করে:
প্রতিটি নন-অ্যারে এবং নন-ম্যাপ ফিল্ডের জন্য, Cloud Firestore দুটি কালেকশন-স্কোপ সিঙ্গেল-ফিল্ড ইনডেক্স সংজ্ঞায়িত করে, একটি আরোহী মোডে এবং একটি অবরোহী মোডে।
প্রতিটি মানচিত্র ক্ষেত্রের জন্য, Cloud Firestore নিম্নলিখিতগুলি তৈরি করে:
- প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি কালেকশন-স্কোপ আরোহী সূচক।
- প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি কালেকশন-স্কোপ ডিসেন্ডিং ইনডেক্স।
- প্রতিটি অ্যারে সাবফিল্ডের জন্য একটি কালেকশন-স্কোপ অ্যারে-তে সূচক থাকে।
- Cloud Firestore প্রতিটি মানচিত্রের সাবফিল্ড পুনরাবৃত্তভাবে সূচী করে।
একটি ডকুমেন্টের প্রতিটি অ্যারে ফিল্ডের জন্য, Cloud Firestore একটি কালেকশন-স্কোপ অ্যারে-কন্টেইনস ইনডেক্স তৈরি এবং রক্ষণাবেক্ষণ করে।
সংগ্রহ গ্রুপ স্কোপ সহ একক-ক্ষেত্র সূচকগুলি ডিফল্টরূপে রক্ষণাবেক্ষণ করা হয় না।
একক-ক্ষেত্র সূচক ছাড়
আপনি একটি একক-ক্ষেত্র সূচক ছাড় তৈরি করে আপনার স্বয়ংক্রিয় সূচীকরণ সেটিংস থেকে একটি ক্ষেত্রকে অব্যাহতি দিতে পারেন। একটি সূচীকরণ ছাড় ডাটাবেস-ব্যাপী স্বয়ংক্রিয় সূচীকরণ সেটিংসকে ওভাররাইড করে। একটি ছাড় একটি একক-ক্ষেত্র সূচক সক্ষম করতে পারে যা আপনার স্বয়ংক্রিয় সূচীকরণ সেটিংস অন্যথায় অক্ষম করবে অথবা একটি একক-ক্ষেত্র সূচক অক্ষম করবে যা স্বয়ংক্রিয় সূচীকরণ অন্যথায় সক্ষম করবে। যেসব ক্ষেত্রে ছাড় কার্যকর হতে পারে, সেগুলির জন্য সূচীকরণের সেরা অনুশীলনগুলি দেখুন।
সংগ্রহ গোষ্ঠীর সকল ক্ষেত্রে সংগ্রহ-স্তরের সূচক ছাড় যোগ করতে * ফিল্ড পাথ মান ব্যবহার করুন। উদাহরণস্বরূপ, সংগ্রহ গোষ্ঠীর comments জন্য, comments সংগ্রহ গোষ্ঠীর সকল ক্ষেত্রের সাথে মিল করার জন্য ফিল্ড পাথটি * তে সেট করুন এবং সংগ্রহ গোষ্ঠীর অধীনে সমস্ত ক্ষেত্রের সূচীকরণ অক্ষম করুন। এরপর আপনি কেবল আপনার প্রশ্নের জন্য প্রয়োজনীয় ক্ষেত্রগুলিকে সূচীকরণে ছাড় যোগ করতে পারেন। সূচীকরণ ক্ষেত্রগুলির সংখ্যা হ্রাস করলে স্টোরেজ খরচ হ্রাস পায় এবং লেখার কর্মক্ষমতা উন্নত হতে পারে।
যদি আপনি একটি মানচিত্র ক্ষেত্রের জন্য একটি একক-ক্ষেত্র সূচক ছাড় তৈরি করেন, তাহলে মানচিত্রের উপক্ষেত্রগুলি সেই সেটিংস উত্তরাধিকারসূত্রে পাবে। তবে, আপনি নির্দিষ্ট উপক্ষেত্রের জন্য একক-ক্ষেত্র সূচক ছাড় নির্ধারণ করতে পারেন। যদি আপনি একটি উপক্ষেত্রের জন্য একটি ছাড় মুছে ফেলেন, তাহলে উপক্ষেত্রটি তার পিতামাতার অব্যাহতি সেটিংস উত্তরাধিকারসূত্রে পাবে, যদি সেগুলি বিদ্যমান থাকে, অথবা যদি কোনও পিতামাতার অব্যাহতি না থাকে তবে ডাটাবেস-ব্যাপী সেটিংস উত্তরাধিকারসূত্রে পাবে।
একক-ক্ষেত্র সূচক ছাড় তৈরি এবং পরিচালনা করতে, সূচক পরিচালনা করুন দেখুন।
কম্পোজিট ইনডেক্স
একটি কম্পোজিট ইনডেক্স একটি সংগ্রহের সমস্ত নথির একটি সাজানো ম্যাপিং সংরক্ষণ করে, যা ইনডেক্সের ক্ষেত্রের ক্রমানুসারে তালিকাভুক্ত।
Cloud Firestore এমন কোয়েরিগুলিকে সমর্থন করার জন্য কম্পোজিট ইনডেক্স ব্যবহার করে যা ইতিমধ্যে একক-ক্ষেত্র সূচক দ্বারা সমর্থিত নয়।
Cloud Firestore স্বয়ংক্রিয়ভাবে একক-ক্ষেত্র সূচকের মতো কম্পোজিট সূচক তৈরি করে না কারণ এটি প্রচুর সংখ্যক সম্ভাব্য ফিল্ড সংমিশ্রণের কারণে। পরিবর্তে, Cloud Firestore আপনার অ্যাপ তৈরি করার সময় প্রয়োজনীয় কম্পোজিট সূচকগুলি সনাক্ত করতে এবং তৈরি করতে সহায়তা করে।
যখনই আপনি এমন কোনও কোয়েরি চেষ্টা করেন যা কোনও সূচক দ্বারা সমর্থিত নয়, তখন Cloud Firestore একটি ত্রুটি বার্তা ফেরত পাঠায় যার সাথে একটি লিঙ্ক থাকে যা আপনি অনুপস্থিত সূচক তৈরি করতে অনুসরণ করতে পারেন।
আপনি কনসোল ব্যবহার করে অথবা Firebase CLI ব্যবহার করে ম্যানুয়ালি কম্পোজিট ইনডেক্স সংজ্ঞায়িত এবং পরিচালনা করতে পারেন। কম্পোজিট ইনডেক্স তৈরি এবং পরিচালনা সম্পর্কে আরও জানতে, Manage index দেখুন।
ইনডেক্স মোড এবং কোয়েরি স্কোপ
আপনি একক-ক্ষেত্র এবং যৌগিক সূচকগুলি ভিন্নভাবে কনফিগার করেন, তবে উভয়ের জন্যই আপনার সূচকগুলির জন্য সূচক মোড এবং ক্যোয়ারী স্কোপগুলি কনফিগার করতে হবে।
সূচক মোড
যখন আপনি একটি সূচী সংজ্ঞায়িত করেন, তখন আপনি প্রতিটি সূচীকৃত ক্ষেত্রের জন্য একটি সূচী মোড নির্বাচন করেন। প্রতিটি ক্ষেত্রের সূচী মোড সেই ক্ষেত্রের নির্দিষ্ট ক্যোয়ারী ক্লজ সমর্থন করে। আপনি নিম্নলিখিত সূচী মোডগুলি থেকে নির্বাচন করতে পারেন:
| সূচক মোড | বিবরণ |
|---|---|
| ঊর্ধ্বমুখী | < , <= , == , >= , > , != , in , এবং not-in , ক্ষেত্রের ক্যোয়ারী ক্লজ সমর্থন করে এবং এই ক্ষেত্রের মানের উপর ভিত্তি করে ফলাফলগুলিকে ঊর্ধ্বক্রম অনুসারে সাজানো সমর্থন করে। |
| অবরোহী দিকে | ক্ষেত্রের < , <= , == , >= , > , != , in , এবং not-in কোয়েরি ক্লজ সমর্থন করে এবং এই ক্ষেত্রের মানের উপর ভিত্তি করে ফলাফলগুলিকে অবরোহী ক্রমে সাজানো সমর্থন করে। |
| অ্যারে-ধারণ করে | ক্ষেত্রের 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 এবং tags ক্ষেত্র সেট করে:
ওয়েব
var citiesRef = db.collection("cities"); citiesRef.doc("SF").set({ name: "San Francisco", state: "CA", country: "USA", capital: false, population: 860000, regions: ["west_coast", "norcal"] }); citiesRef.doc("LA").set({ name: "Los Angeles", state: "CA", country: "USA", capital: false, population: 3900000, regions: ["west_coast", "socal"] }); citiesRef.doc("DC").set({ name: "Washington, D.C.", state: null, country: "USA", capital: true, population: 680000, regions: ["east_coast"] }); citiesRef.doc("TOK").set({ name: "Tokyo", state: null, country: "Japan", capital: true, population: 9000000, regions: ["kanto", "honshu"] }); citiesRef.doc("BJ").set({ name: "Beijing", state: null, country: "China", capital: true, population: 21500000, regions: ["jingjinji", "hebei"] });
ডিফল্ট স্বয়ংক্রিয় ইনডেক্সিং সেটিংস ধরে নিলে, Cloud Firestore অ্যারে ক্ষেত্রের জন্য একটি অ্যারোনিং সিঙ্গেল-ফিল্ড ইনডেক্স, নন-অ্যারে ক্ষেত্রের জন্য একটি ডিসেন্ডিং সিঙ্গেল-ফিল্ড ইনডেক্স এবং অ্যারে ক্ষেত্রের জন্য একটি অ্যারে-কন্টেইনস সিঙ্গেল-ফিল্ড ইনডেক্স আপডেট করে। নিম্নলিখিত টেবিলের প্রতিটি সারি একটি সিঙ্গেল-ফিল্ড ইনডেক্সে একটি এন্ট্রি উপস্থাপন করে:
| সংগ্রহ | ক্ষেত্র সূচীবদ্ধ | কোয়েরির সুযোগ |
|---|---|---|
| শহরগুলি | নাম | সংগ্রহ |
| শহরগুলি | অবস্থা | সংগ্রহ |
| শহরগুলি | দেশ | সংগ্রহ |
| শহরগুলি | মূলধন | সংগ্রহ |
| শহরগুলি | জনসংখ্যা | সংগ্রহ |
| শহরগুলি | নাম | সংগ্রহ |
| শহরগুলি | অবস্থা | সংগ্রহ |
| শহরগুলি | দেশ | সংগ্রহ |
| শহরগুলি | ক্যাপিটাল | সংগ্রহ |
| শহরগুলি | জনসংখ্যা | সংগ্রহ |
| শহরগুলি | array-contains অঞ্চলগুলি | সংগ্রহ |
একক-ক্ষেত্র সূচক দ্বারা সমর্থিত প্রশ্নগুলি
এই স্বয়ংক্রিয়ভাবে তৈরি একক-ক্ষেত্র সূচকগুলি ব্যবহার করে, আপনি নিম্নলিখিতগুলির মতো সহজ প্রশ্নগুলি চালাতে পারেন:
ওয়েব
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
আপনি in এবং compound equality ( == ) কোয়েরি তৈরি করতে পারেন:
ওয়েব
citiesRef.where('country', 'in', ["USA", "Japan", "China"])
// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
.where("capital", "==", false)
.where("state", "==", "CA")
.where("population", "==", 860000) যদি আপনার এমন একটি যৌগিক কোয়েরি চালানোর প্রয়োজন হয় যা একটি পরিসর তুলনা ব্যবহার করে ( < , <= , > , অথবা >= ) অথবা যদি আপনাকে অন্য কোনও ক্ষেত্র অনুসারে সাজানোর প্রয়োজন হয়, তাহলে আপনাকে অবশ্যই সেই কোয়েরির জন্য একটি যৌগিক সূচক তৈরি করতে হবে।
array-contains ইনডেক্স আপনাকে regions অ্যারে ক্ষেত্রটি অনুসন্ধান করতে দেয়:
ওয়েব
citiesRef.where("regions", "array-contains", "west_coast") // array-contains-any and array-contains use the same indexes citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
কম্পোজিট ইনডেক্স দ্বারা সমর্থিত কোয়েরি
Cloud Firestore এমন যৌগিক প্রশ্নগুলিকে সমর্থন করার জন্য কম্পোজিট ইনডেক্স ব্যবহার করে যা ইতিমধ্যে একক-ক্ষেত্র সূচক দ্বারা সমর্থিত নয়। উদাহরণস্বরূপ, নিম্নলিখিত প্রশ্নের জন্য আপনার একটি কম্পোজিট সূচকের প্রয়োজন হবে:
ওয়েব
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
.where("population", ">", 690000) এই কোয়েরিগুলির জন্য নীচের কম্পোজিট ইনডেক্সটি প্রয়োজন। যেহেতু কোয়েরিটি 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
- শহরের নাম DESC
- তাপমাত্রা। গ্রীষ্মকালীন ASC
- তাপমাত্রা। গ্রীষ্ম DESC
- তাপমাত্রা। শীতকালীন ASC
- তাপমাত্রা। শীতকালীন DESC
- পাড়া অ্যারে ধারণ করে (ASC এবং DESC)
কম্পোজিট ইনডেক্স
- শহরের নাম ASC, পাড়াগুলি ARRAY
- শহরের নাম DESC, পাড়াগুলি ARRAY
সূচী এন্ট্রি
এই ইনডেক্সিং কনফিগারেশনের ফলে ডকুমেন্টের জন্য নিম্নলিখিত ইনডেক্স এন্ট্রিগুলি তৈরি হয়:
| সূচক | সূচীবদ্ধ তথ্য |
|---|---|
| একক-ক্ষেত্র সূচক এন্ট্রি | |
| শহরের নাম ASC | শহরের নাম: "সান ফ্রান্সিসকো" |
| শহরের নাম DESC | শহরের নাম: "সান ফ্রান্সিসকো" |
| তাপমাত্রা। গ্রীষ্মকালীন ASC | তাপমাত্রা। গ্রীষ্ম: ৬৭ |
| তাপমাত্রা। গ্রীষ্ম DESC | তাপমাত্রা। গ্রীষ্ম: ৬৭ |
| তাপমাত্রা। শীতকালীন ASC | শীতকালীন তাপমাত্রা: ৫৫ |
| তাপমাত্রা। শীতকালীন DESC | শীতকালীন তাপমাত্রা: ৫৫ |
| পাড়ার অ্যারেতে ASC থাকে | পাড়া: "মিশন" |
| পাড়ার অ্যারেতে DESC থাকে | পাড়া: "মিশন" |
| পাড়ার অ্যারেতে ASC থাকে | পাড়া: "শহরের কেন্দ্রস্থল" |
| পাড়ার অ্যারেতে DESC থাকে | পাড়া: "শহরের কেন্দ্রস্থল" |
| পাড়ার অ্যারেতে ASC থাকে | পাড়া: "মেরিনা" |
| পাড়ার অ্যারেতে DESC থাকে | পাড়া: "মেরিনা" |
| কম্পোজিট ইনডেক্স এন্ট্রি | |
| শহরের নাম ASC, পাড়াগুলি ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", পাড়া: "মিশন" |
| শহরের নাম ASC, পাড়াগুলি ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", পাড়া: "শহরের কেন্দ্রস্থল" |
| শহরের নাম ASC, পাড়াগুলি ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", পাড়া: "মেরিনা" |
| শহরের নাম DESC, পাড়াগুলি ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", পাড়া: "মিশন" |
| শহরের নাম DESC, পাড়াগুলি ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", পাড়া: "শহরের কেন্দ্রস্থল" |
| শহরের নাম DESC, পাড়াগুলি ARRAY | শহরের নাম: "সান ফ্রান্সিসকো", পাড়া: "মেরিনা" |
সূচক এবং মূল্য নির্ধারণ
আপনার অ্যাপ্লিকেশনের স্টোরেজ খরচে সূচীগুলি অবদান রাখে। সূচীর জন্য স্টোরেজ আকার কীভাবে গণনা করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, সূচী এন্ট্রি আকার দেখুন।
সূচক মার্জিং ব্যবহার করুন
যদিও Cloud Firestore প্রতিটি প্রশ্নের জন্য একটি সূচক ব্যবহার করে, তবে প্রতিটি প্রশ্নের জন্য একটি সূচকের প্রয়োজন হয় না। একাধিক সমতা ( == ) ধারা এবং ঐচ্ছিকভাবে, একটি orderBy ধারা সহ প্রশ্নের জন্য, Cloud Firestore বিদ্যমান সূচকগুলি পুনরায় ব্যবহার করতে পারে। Cloud Firestore বৃহত্তর সমতা প্রশ্নের জন্য প্রয়োজনীয় কম্পোজিট সূচক তৈরি করতে সহজ সমতা ফিল্টারের জন্য সূচকগুলিকে একত্রিত করতে পারে।
আপনি এমন পরিস্থিতি চিহ্নিত করে ইনডেক্সিং খরচ কমাতে পারেন যেখানে আপনি ইনডেক্স মার্জিং ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি রেস্তোরাঁ রেটিং অ্যাপের জন্য একটি restaurants সংগ্রহে:
রেস্তোরাঁ
বার্গারথাইম
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
এই অ্যাপটি নিম্নলিখিত ধরণের প্রশ্ন ব্যবহার করে। অ্যাপটি category , city এবং editors_pick জন্য সমতা ধারার সংমিশ্রণ ব্যবহার করে, এবং সর্বদা 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")আপনি প্রতিটি প্রশ্নের জন্য একটি সূচক তৈরি করতে পারেন:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্রগুলি | কোয়েরির সুযোগ |
|---|---|---|
| রেস্তোরাঁ | বিভাগ, তারকা_রেটিং | সংগ্রহ |
| রেস্তোরাঁ | শহর, তারকা_রেটিং | সংগ্রহ |
| রেস্তোরাঁ | বিভাগ, শহর, তারকা_রেটিং | সংগ্রহ |
| রেস্তোরাঁ | বিভাগ, শহর, সম্পাদক_পিক, তারকা_রেটিং | সংগ্রহ |
আরও ভালো সমাধান হিসেবে, আপনি Cloud Firestore সমতা ধারাগুলির জন্য সূচকগুলিকে একত্রিত করার ক্ষমতা ব্যবহার করে সূচকের সংখ্যা কমাতে পারেন:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্রগুলি | কোয়েরির সুযোগ |
|---|---|---|
| রেস্তোরাঁ | বিভাগ, তারকা_রেটিং | সংগ্রহ |
| রেস্তোরাঁ | শহর, তারকা_রেটিং | সংগ্রহ |
| রেস্তোরাঁ | সম্পাদক_পিক, তারকা_রেটিং | সংগ্রহ |
এই সূচকের সেটটি কেবল ছোটই নয়, এটি একটি অতিরিক্ত কোয়েরিও সমর্থন করে:
ওয়েব
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")ইনডেক্সিং সীমা
নিম্নলিখিত সীমাগুলি সূচকের ক্ষেত্রে প্রযোজ্য। কোটা এবং সীমা সম্পর্কে আরও তথ্যের জন্য, কোটা এবং সীমা দেখুন।
| সীমা | বিস্তারিত |
|---|---|
| একটি ডাটাবেসের জন্য সর্বাধিক সংখ্যক কম্পোজিট ইনডেক্স |
|
| একটি ডাটাবেসের জন্য সর্বাধিক একক-ক্ষেত্র কনফিগারেশনের সংখ্যা |
একটি ফিল্ড লেভেল কনফিগারেশনে একই ফিল্ডের জন্য একাধিক কনফিগারেশন থাকতে পারে। উদাহরণস্বরূপ, একটি সিঙ্গেল-ফিল্ড ইনডেক্সিং এক্সেম্পশন এবং একই ফিল্ডে একটি TTL নীতি সীমার দিকে একটি ফিল্ড কনফিগারেশন হিসাবে গণনা করা হয়। |
প্রতিটি নথির জন্য সর্বোচ্চ সংখ্যক সূচক এন্ট্রি | ৪০,০০০ একটি নথির জন্য সূচক এন্ট্রির সংখ্যা নিম্নলিখিতগুলির যোগফল:
Cloud Firestore কীভাবে একটি ডকুমেন্ট এবং ইনডেক্সের একটি সেটকে ইনডেক্স এন্ট্রিতে রূপান্তর করে তা দেখতে, এই ইনডেক্স এন্ট্রি গণনার উদাহরণটি দেখুন। |
| একটি যৌগিক সূচকে ক্ষেত্রের সর্বাধিক সংখ্যা | ১০০ |
| একটি সূচক এন্ট্রির সর্বোচ্চ আকার | ৭.৫ কিলোবাইট Cloud Firestore কীভাবে সূচক প্রবেশের আকার গণনা করে তা দেখতে, সূচক প্রবেশের আকার দেখুন। |
| একটি নথির সূচী এন্ট্রির আকারের সর্বোচ্চ যোগফল | ৮ মাইল মোট আকার হল একটি নথির জন্য নিম্নলিখিতগুলির যোগফল: |
| একটি সূচীকৃত ক্ষেত্রের মানের সর্বোচ্চ আকার | ১৫০০ বাইট ১৫০০ বাইটের বেশি ফিল্ড মান কেটে ফেলা হয়েছে। কেটে ফেলা ফিল্ড মান সম্পর্কিত কোয়েরিগুলি অসঙ্গত ফলাফল দিতে পারে। |
সূচীকরণের সেরা অনুশীলন
বেশিরভাগ অ্যাপের ক্ষেত্রে, আপনি আপনার ইনডেক্স পরিচালনা করার জন্য স্বয়ংক্রিয় ইনডেক্সিং এবং ত্রুটি বার্তা লিঙ্কের উপর নির্ভর করতে পারেন। তবে, নিম্নলিখিত ক্ষেত্রে আপনি একক-ক্ষেত্রের ছাড় যোগ করতে চাইতে পারেন:
| মামলা | বিবরণ |
|---|---|
| বড় স্ট্রিং ক্ষেত্র | যদি আপনার এমন একটি স্ট্রিং ফিল্ড থাকে যেখানে প্রায়শই লম্বা স্ট্রিং মান থাকে যা আপনি কোয়েরির জন্য ব্যবহার করেন না, তাহলে আপনি ফিল্ডটিকে ইনডেক্সিং থেকে অব্যাহতি দিয়ে স্টোরেজ খরচ কমাতে পারেন। |
| ক্রমিক মান সহ নথি ধারণকারী সংগ্রহে উচ্চ লেখার হার | যদি আপনি এমন একটি ক্ষেত্র সূচী করেন যা একটি সংগ্রহের নথির মধ্যে ক্রমানুসারে বৃদ্ধি বা হ্রাস পায়, যেমন একটি টাইমস্ট্যাম্প, তাহলে সংগ্রহের সর্বোচ্চ লেখার হার প্রতি সেকেন্ডে 500টি লেখা। যদি আপনি ক্রমানুসারে মান সহ ক্ষেত্রের উপর ভিত্তি করে অনুসন্ধান না করেন, তাহলে আপনি এই সীমা অতিক্রম করার জন্য ক্ষেত্রটিকে সূচী থেকে অব্যাহতি দিতে পারেন। উদাহরণস্বরূপ, উচ্চ লেখার হার সহ IoT ব্যবহারের ক্ষেত্রে, টাইমস্ট্যাম্প ক্ষেত্র সহ নথি ধারণকারী একটি সংগ্রহ প্রতি সেকেন্ডে 500 লেখার সীমার কাছাকাছি যেতে পারে। |
| টিটিএল ক্ষেত্র | যদি আপনি TTL (টাইম-টু-লাইভ) নীতি ব্যবহার করেন, তাহলে মনে রাখবেন যে TTL ক্ষেত্রটি অবশ্যই একটি টাইমস্ট্যাম্প হতে হবে। TTL ক্ষেত্রগুলিতে ইনডেক্সিং ডিফল্টরূপে সক্ষম থাকে এবং উচ্চ ট্র্যাফিক হারে কর্মক্ষমতা প্রভাবিত করতে পারে। সর্বোত্তম অনুশীলন হিসাবে, আপনার TTL ক্ষেত্রগুলির জন্য একক-ক্ষেত্র ছাড় যোগ করুন। |
| বড় অ্যারে বা মানচিত্র ক্ষেত্র | বৃহৎ অ্যারে বা মানচিত্র ক্ষেত্রগুলি প্রতি নথিতে 40,000 সূচক এন্ট্রির সীমার কাছাকাছি যেতে পারে। যদি আপনি একটি বৃহৎ অ্যারে বা মানচিত্র ক্ষেত্রের উপর ভিত্তি করে অনুসন্ধান না করেন, তাহলে আপনার এটিকে সূচীকরণ থেকে অব্যাহতি দেওয়া উচিত। |
যদি আপনি একাধিক ক্ষেত্রে রেঞ্জ এবং ইনকুয়ালিটি অপারেটরদের সাথে কোয়েরি ব্যবহার করেন, Cloud Firestore কোয়েরির কর্মক্ষমতা এবং খরচ অপ্টিমাইজ করার জন্য আপনার বিবেচনা করা উচিত এমন ইনডেক্সিং বিবেচ্য বিষয়গুলি দেখুন।
ইনডেক্সিং সমস্যাগুলি (ইনডেক্স ফ্যানআউট, INVALID_ARGUMENT ত্রুটি) কীভাবে সমাধান করবেন সে সম্পর্কে আরও তথ্যের জন্য সমস্যা সমাধান পৃষ্ঠাটি দেখুন।