ক্লাউড ফায়ারস্টোরে সূচকের ধরন

একটি ডাটাবেসের কর্মক্ষমতার ক্ষেত্রে সূচী একটি গুরুত্বপূর্ণ বিষয়। একটি বইয়ের সূচীর মতো, যা একটি বইয়ের বিষয়গুলিকে পৃষ্ঠা সংখ্যার সাথে ম্যাপ করে, একটি ডাটাবেস সূচী একটি ডাটাবেসের আইটেমগুলিকে ডাটাবেসের মধ্যে তাদের অবস্থানের সাথে ম্যাপ করে। যখন আপনি একটি ডাটাবেস অনুসন্ধান করেন, তখন ডাটাবেস আপনার অনুরোধ করা আইটেমগুলির অবস্থান দ্রুত সনাক্ত করতে একটি সূচী ব্যবহার করতে পারে।

এই পৃষ্ঠাটি 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 ব্যবহার করে ম্যানুয়ালি ইনডেক্স সংজ্ঞায়িত এবং পরিচালনা করতে পারেন। ম্যানুয়াল ইনডেক্স তৈরি এবং পরিচালনা সম্পর্কে আরও জানতে, Manage indexes দেখুন।

ইনডেক্স মোড এবং কোয়েরি স্কোপ

আপনি স্বয়ংক্রিয় এবং ম্যানুয়াল সূচকগুলি আলাদাভাবে কনফিগার করেন, তবে উভয়ের জন্যই আপনার সূচকগুলির জন্য সূচক মোড এবং ক্যোয়ারী স্কোপগুলি কনফিগার করতে হবে।

সূচক মোড

যখন আপনি একটি সূচী সংজ্ঞায়িত করেন, তখন আপনি প্রতিটি সূচীকৃত ক্ষেত্রের জন্য একটি সূচী মোড নির্বাচন করেন। প্রতিটি ক্ষেত্রের সূচী মোড সেই ক্ষেত্রের নির্দিষ্ট ক্যোয়ারী ক্লজ সমর্থন করে। আপনি নিম্নলিখিত সূচী মোডগুলি থেকে নির্বাচন করতে পারেন:

সূচক মোড বিবরণ
ঊর্ধ্বমুখী < , <= , == , >= , > , != , in , এবং not-in , ক্ষেত্রের ক্যোয়ারী ক্লজ সমর্থন করে এবং এই ক্ষেত্রের মানের উপর ভিত্তি করে ফলাফলগুলিকে ঊর্ধ্বক্রম অনুসারে সাজানো সমর্থন করে।
অবরোহী ক্ষেত্রের < , <= , == , >= , > , != , in , এবং not-in কোয়েরি ক্লজ সমর্থন করে এবং এই ক্ষেত্রের মানের উপর ভিত্তি করে ফলাফলগুলিকে অবরোহী ক্রমে সাজানো সমর্থন করে।
অ্যারে-ধারণ করে ক্ষেত্রের array-contains এবং array-contains-any কোয়েরি ক্লজ সমর্থন করে।
ভেক্টর ক্ষেত্রের FindNearest ক্যোয়ারী ক্লজ সমর্থন করে।

কোয়েরি স্কোপ

প্রতিটি সূচক একটি সংগ্রহ অথবা একটি সংগ্রহ গোষ্ঠীর মধ্যে সীমাবদ্ধ। এটি সূচকের কোয়েরি স্কোপ নামে পরিচিত:

সংগ্রহের সুযোগ
Cloud Firestore ডিফল্টরূপে সংগ্রহের সুযোগ সহ সূচী তৈরি করে। এই সূচীগুলি এমন কোয়েরিগুলিকে সমর্থন করে যা একটি একক সংগ্রহ থেকে ফলাফল ফেরত দেয়।

সংগ্রহ গ্রুপের সুযোগ
একটি সংগ্রহ গোষ্ঠীতে একই সংগ্রহ আইডি সহ সমস্ত সংগ্রহ অন্তর্ভুক্ত থাকে। একটি সংগ্রহ গোষ্ঠীর কোয়েরি চালানোর জন্য যা একটি সংগ্রহ গোষ্ঠী থেকে ফিল্টার করা বা ক্রমযুক্ত ফলাফল ফেরত দেয়, আপনাকে সংগ্রহ গোষ্ঠীর সুযোগ সহ একটি সংশ্লিষ্ট সূচক তৈরি করতে হবে।

ডিফল্ট ক্রম এবং __name__ ক্ষেত্র

প্রতিটি ক্ষেত্রের জন্য নির্দিষ্ট সূচক মোড (ঊর্ধ্বমুখী বা অবরোহী) অনুসারে ডকুমেন্ট সাজানোর পাশাপাশি, সূচকগুলি প্রতিটি নথির __name__ ফিল্ড অনুসারে চূড়ান্ত বাছাই প্রয়োগ করে। __name__ ফিল্ডের মান সম্পূর্ণ ডকুমেন্ট পাথে সেট করা আছে। এর অর্থ হল একই ক্ষেত্রের মান সহ ফলাফল সেটে থাকা ডকুমেন্টগুলি ডকুমেন্ট পাথ অনুসারে সাজানো হয়েছে।

ডিফল্টরূপে, __name__ ক্ষেত্রটি সূচক সংজ্ঞায় শেষ সাজানো ক্ষেত্রের একই দিকে সাজানো হয়। উদাহরণস্বরূপ:

সংগ্রহ সূচীবদ্ধ ক্ষেত্রগুলি কোয়েরির সুযোগ
শহরগুলি নাম, __name__ সংগ্রহ
শহরগুলি অবস্থা, __name__ সংগ্রহ
শহরগুলি দেশ, জনসংখ্যা, __name__ সংগ্রহ

ডিফল্ট নয় এমন __name__ দিক অনুসারে ফলাফল সাজানোর জন্য, আপনাকে সেই সূচকটি তৈরি করতে হবে।

সূচক বৈশিষ্ট্য

একটি সূচক যা কোয়েরিটি সবচেয়ে দক্ষতার সাথে সম্পাদন করতে দেয় তা নিম্নলিখিত বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়:

  • সমতা ফিল্টারে ব্যবহৃত ক্ষেত্রগুলি
  • সাজানোর ক্রমে ব্যবহৃত ক্ষেত্রগুলি
  • পরিসর এবং বৈষম্য ফিল্টারে ব্যবহৃত ক্ষেত্রগুলি (যা ইতিমধ্যে সাজানোর ক্রমগুলিতে অন্তর্ভুক্ত নয়)
  • সমষ্টিতে ব্যবহৃত ক্ষেত্রগুলি (যা ইতিমধ্যেই সাজানোর ক্রম এবং পরিসর এবং বৈষম্য ফিল্টারে অন্তর্ভুক্ত নয়)

Cloud Firestore নিম্নলিখিতভাবে প্রশ্নের ফলাফল গণনা করে:

  1. কোয়েরির সংগ্রহ, ফিল্টার বৈশিষ্ট্য, ফিল্টার অপারেটর এবং সাজানোর ক্রম অনুসারে সূচক চিহ্নিত করে।
  2. স্ক্যানিং শুরু হওয়া সূচকের অবস্থান চিহ্নিত করে। শুরুর অবস্থানটি কোয়েরির সমতা ফিল্টারের সাথে যুক্ত থাকে এবং প্রথম orderBy ক্ষেত্রের পরিসর এবং অসমতা ফিল্টার দিয়ে শেষ হয়।
  3. সূচকটি স্ক্যান করা শুরু করে, সমস্ত ফিল্টার পূরণ করে এমন প্রতিটি নথি ফেরত দেয়, যতক্ষণ না স্ক্যানিং প্রক্রিয়াটি নিম্নলিখিতগুলির মধ্যে একটি করে:
    • এমন একটি নথির মুখোমুখি হয় যা ফিল্টার শর্ত পূরণ করে না এবং নিশ্চিত করে যে পরবর্তী কোনও নথি কখনই ফিল্টার শর্ত সম্পূর্ণরূপে পূরণ করবে না।
    • সূচকের শেষে পৌঁছায়।
    • কোয়েরি দ্বারা অনুরোধ করা সর্বাধিক সংখ্যক ফলাফল সংগ্রহ করে।

ইনডেক্সিং উদাহরণ

আপনার জন্য স্বয়ংক্রিয়ভাবে একক-ক্ষেত্র সূচক তৈরি করে, 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"])

ম্যানুয়াল ইনডেক্স দ্বারা সমর্থিত প্রশ্নগুলি

স্বয়ংক্রিয় একক-ক্ষেত্র সূচক দ্বারা সমর্থিত নয় এমন যৌগিক প্রশ্নগুলিকে সমর্থন করার জন্য ম্যানুয়াল সূচক তৈরি করুন। উদাহরণস্বরূপ, নিম্নলিখিত প্রশ্নের জন্য আপনার একটি ম্যানুয়াল সূচকের প্রয়োজন হবে:

ওয়েব
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 কোয়েরি অতিরিক্ত ধারা সহ একত্রিত করে একটি index তৈরি করার পরামর্শ দিচ্ছি:

ওয়েব
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
  • তাপমাত্রা। শীতকালীন DESC
  • পাড়ার অ্যারে ধারণ করে

ম্যানুয়াল সূচী

  • শহরের নাম ASC, পাড়াগুলি ARRAY
  • শহরের নাম DESC, পাড়াগুলি ARRAY

সূচী এন্ট্রি

এই ইনডেক্সিং কনফিগারেশনের ফলে ডকুমেন্টের জন্য নিম্নলিখিত ইনডেক্স এন্ট্রিগুলি তৈরি হয়:

সূচক সূচীবদ্ধ তথ্য
স্বয়ংক্রিয় সূচী এন্ট্রি
শহরের নাম 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 ত্রুটি) কীভাবে সমাধান করবেন সে সম্পর্কে আরও তথ্যের জন্য সমস্যা সমাধান পৃষ্ঠাটি দেখুন।