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

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

এই পৃষ্ঠাটি ক্লাউড ফায়ারস্টোর ব্যবহার করে এমন দুটি ধরণের সূচী বর্ণনা করে, একক-ক্ষেত্র সূচী এবং যৌগিক সূচী

সূচক সংজ্ঞা এবং গঠন

একটি প্রদত্ত নথির ক্ষেত্রগুলির একটি তালিকায় একটি সূচক সংজ্ঞায়িত করা হয়, প্রতিটি ক্ষেত্রের জন্য একটি সংশ্লিষ্ট সূচক মোড সহ।

একটি সূচকে সূচকের সংজ্ঞায় নাম দেওয়া প্রতিটি ক্ষেত্রের জন্য একটি এন্ট্রি থাকে। সূচীতে এমন সমস্ত নথি অন্তর্ভুক্ত রয়েছে যা সূচকের উপর ভিত্তি করে প্রশ্নের সম্ভাব্য ফলাফল। সূচকে ব্যবহৃত প্রতিটি ক্ষেত্রের জন্য একটি সূচীকৃত মান সেট থাকলেই একটি নথিকে সূচকে অন্তর্ভুক্ত করা হয়; যদি সূচির সংজ্ঞাটি এমন একটি ক্ষেত্রকে বোঝায় যার জন্য নথির কোনও মান সেট নেই, তবে সেই নথিটি সূচীতে উপস্থিত হবে না এবং তাই সূচকের উপর ভিত্তি করে কোনও প্রশ্নের জন্য ফলাফল হিসাবে কখনই ফেরত দেওয়া হবে না।

যৌগিক সূচকটি ক্ষেত্রের মান দ্বারা বাছাই করা হয়, সূচক সংজ্ঞায় উল্লেখ করা ক্রমে।

প্রতিটি প্রশ্নের পিছনে একটি সূচক

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

কম সূচক ব্যবস্থাপনা, আরও অ্যাপ বিকাশ

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

সূচক প্রকার

ক্লাউড ফায়ারস্টোর দুটি ধরণের সূচক ব্যবহার করে: একক-ক্ষেত্র এবং যৌগিক । সূচীকৃত ক্ষেত্রের সংখ্যা ছাড়াও, একক-ক্ষেত্র এবং যৌগিক সূচীগুলি আপনি কীভাবে পরিচালনা করেন তার মধ্যে পার্থক্য রয়েছে।

একক-ক্ষেত্র সূচক

একটি একক-ক্ষেত্র সূচক একটি নির্দিষ্ট ক্ষেত্র ধারণ করে এমন একটি সংগ্রহের সমস্ত নথির একটি সাজানো ম্যাপিং সংরক্ষণ করে। একটি একক-ক্ষেত্র সূচকের প্রতিটি এন্ট্রি একটি নির্দিষ্ট ক্ষেত্রের জন্য একটি নথির মান এবং ডাটাবেসে নথির অবস্থান রেকর্ড করে। ক্লাউড ফায়ারস্টোর এই সূচীগুলি ব্যবহার করে অনেকগুলি প্রাথমিক প্রশ্নগুলি সম্পাদন করে৷ আপনি আপনার ডাটাবেসের স্বয়ংক্রিয় সূচীকরণ সেটিংস এবং সূচক ছাড়গুলি কনফিগার করে একক-ক্ষেত্রের সূচীগুলি পরিচালনা করেন।

স্বয়ংক্রিয় সূচীকরণ

ডিফল্টরূপে, ক্লাউড ফায়ারস্টোর স্বয়ংক্রিয়ভাবে একটি নথিতে প্রতিটি ক্ষেত্রের জন্য একক-ক্ষেত্রের সূচী এবং একটি মানচিত্রের প্রতিটি সাবফিল্ড বজায় রাখে। ক্লাউড ফায়ারস্টোর একক-ক্ষেত্র সূচীগুলির জন্য নিম্নলিখিত ডিফল্ট সেটিংস ব্যবহার করে:

  • প্রতিটি নন-অ্যারে এবং নন-ম্যাপ ফিল্ডের জন্য, ক্লাউড ফায়ারস্টোর দুটি সংগ্রহ-স্কোপ একক-ক্ষেত্র সূচী সংজ্ঞায়িত করে, একটি ঊর্ধ্বমুখী মোডে এবং একটি অবরোহী মোডে।

  • প্রতিটি মানচিত্র ক্ষেত্রের জন্য, ক্লাউড ফায়ারস্টোর নিম্নলিখিতগুলি তৈরি করে:

    • প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি সংগ্রহ-স্কোপের আরোহী সূচক।
    • প্রতিটি নন-অ্যারে, নন-ম্যাপ সাবফিল্ডের জন্য একটি সংগ্রহ-স্কোপ অবরোহী সূচক।
    • প্রতিটি অ্যারের সাবফিল্ডের জন্য একটি সংগ্রহ-স্কোপ অ্যারে-তে সূচক রয়েছে।
    • ক্লাউড ফায়ারস্টোর প্রতিটি মানচিত্র সাবফিল্ড পুনরাবৃত্তভাবে সূচী করে।
  • একটি নথিতে প্রতিটি অ্যারে ক্ষেত্রের জন্য, ক্লাউড ফায়ারস্টোর একটি সংগ্রহ-স্কোপ অ্যারে-ধারণ সূচক তৈরি করে এবং বজায় রাখে।

  • সংগ্রহ গ্রুপ সুযোগ সহ একক-ক্ষেত্র সূচী ডিফল্টরূপে রক্ষণাবেক্ষণ করা হয় না।

একক-ক্ষেত্র সূচক ছাড়

আপনি একটি একক-ক্ষেত্র সূচক ছাড় তৈরি করে আপনার স্বয়ংক্রিয় সূচক সেটিংস থেকে একটি ক্ষেত্রকে ছাড় দিতে পারেন। একটি ইন্ডেক্সিং ছাড় ডাটাবেস-ব্যাপী স্বয়ংক্রিয় সূচক সেটিংসকে ওভাররাইড করে। একটি ছাড় একটি একক-ক্ষেত্র সূচী সক্ষম করতে পারে যা আপনার স্বয়ংক্রিয় সূচীকরণ সেটিংস অন্যথায় একটি একক-ক্ষেত্র সূচক অক্ষম বা অক্ষম করবে যা স্বয়ংক্রিয় সূচী অন্যথায় সক্ষম হবে। এমন ক্ষেত্রে যেখানে ছাড়গুলি কার্যকর হতে পারে, সূচীকরণের সেরা অনুশীলনগুলি দেখুন৷

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

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

একক-ক্ষেত্র সূচক ছাড় তৈরি এবং পরিচালনা করতে, ক্লাউড ফায়ারস্টোরে সূচক পরিচালনা দেখুন।

যৌগিক সূচক

একটি যৌগিক সূচক একটি সংগ্রহের সমস্ত নথির একটি সাজানো ম্যাপিং সঞ্চয় করে, সূচীতে ক্ষেত্রগুলির একটি আদেশকৃত তালিকার উপর ভিত্তি করে।

ক্লাউড ফায়ারস্টোর একক-ক্ষেত্র সূচী দ্বারা সমর্থিত নয় এমন প্রশ্নের সমর্থন করার জন্য যৌগিক সূচী ব্যবহার করে।

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

আপনি যদি প্রথমে প্রয়োজনীয় সূচক তৈরি না করে উপরের ক্যোয়ারীটি করার চেষ্টা করেন, তাহলে Cloud Firestore একটি ত্রুটি বার্তা প্রদান করে যেখানে একটি লিঙ্ক রয়েছে যা আপনি অনুপস্থিত সূচক তৈরি করতে অনুসরণ করতে পারেন। আপনি একটি সূচক দ্বারা সমর্থিত নয় এমন একটি প্রশ্নের চেষ্টা করার সময় এটি ঘটে। আপনি কনসোল ব্যবহার করে বা Firebase CLI ব্যবহার করে ম্যানুয়ালি যৌগিক সূচকগুলি সংজ্ঞায়িত এবং পরিচালনা করতে পারেন। যৌগিক সূচক তৈরি এবং পরিচালনার বিষয়ে আরও জানতে, সূচক পরিচালনা দেখুন।

সূচক মোড এবং ক্যোয়ারী স্কোপ

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

সূচক মোড

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

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

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

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

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

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

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

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

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

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

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

নিখুঁত সূচক

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

  1. সমতা ফিল্টারে ব্যবহৃত ক্ষেত্র
  2. বাছাই আদেশে ব্যবহৃত ক্ষেত্র
  3. পরিসীমা এবং অসমতা ফিল্টারে ব্যবহৃত ক্ষেত্রগুলি (যা ইতিমধ্যে সাজানোর আদেশে অন্তর্ভুক্ত নয়)
  4. সমষ্টিতে ব্যবহৃত ক্ষেত্রগুলি (যা ইতিমধ্যে সাজানোর আদেশ এবং পরিসর এবং অসমতা ফিল্টারগুলিতে অন্তর্ভুক্ত নয়)

Firestore নিম্নরূপ প্রশ্নের জন্য ফলাফল গণনা করে:

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

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

আপনার জন্য স্বয়ংক্রিয়ভাবে একক-ক্ষেত্রের সূচী তৈরি করে, ক্লাউড ফায়ারস্টোর আপনার অ্যাপ্লিকেশনটিকে সবচেয়ে প্রাথমিক ডেটাবেস প্রশ্নগুলিকে দ্রুত সমর্থন করার অনুমতি দেয়৷ একক-ক্ষেত্রের সূচীগুলি আপনাকে ক্ষেত্রের মান এবং তুলনাকারী < , <= , == , >= , > , এবং 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"] });

ডিফল্ট স্বয়ংক্রিয় সূচীকরণ সেটিংস অনুমান করে, ক্লাউড ফায়ারস্টোর নন-অ্যারে ফিল্ড প্রতি একটি ঊর্ধ্বমুখী একক-ক্ষেত্র সূচক, নন-অ্যারে ক্ষেত্র প্রতি একটি অবতরণ একক-ক্ষেত্র সূচক এবং অ্যারে ক্ষেত্রের জন্য একটি অ্যারে-ধারণ করে একক-ক্ষেত্র সূচক আপডেট করে। নিম্নলিখিত টেবিলের প্রতিটি সারি একটি একক-ক্ষেত্র সূচকে একটি এন্ট্রি প্রতিনিধিত্ব করে:

সংগ্রহ ক্ষেত্র সূচীকৃত প্রশ্নের সুযোগ
শহরগুলি নাম সংগ্রহ
শহরগুলি অবস্থা সংগ্রহ
শহরগুলি দেশ সংগ্রহ
শহরগুলি মূলধন সংগ্রহ
শহরগুলি জনসংখ্যা সংগ্রহ
শহরগুলি নাম সংগ্রহ
শহরগুলি অবস্থা সংগ্রহ
শহরগুলি দেশ সংগ্রহ
শহরগুলি মূলধন সংগ্রহ
শহরগুলি জনসংখ্যা সংগ্রহ
শহরগুলি 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"]

একক-ক্ষেত্র সূচক

  • city_name ASC
  • শহরের_নাম DESC
  • তাপমাত্রা. গ্রীষ্ম ASC
  • তাপমাত্রা. গ্রীষ্ম DESC
  • তাপমাত্রা. শীতকালে ASC
  • তাপমাত্রা. শীতকালীন DESC
  • আশেপাশের অ্যারে ধারণ করে (ASC এবং DESC)

যৌগিক সূচক

  • city_name ASC, আশেপাশের এলাকা ARRAY
  • city_name DESC, আশেপাশের এলাকা ARRAY৷

সূচক এন্ট্রি

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

সূচক সূচীকৃত তথ্য
একক-ক্ষেত্র সূচক এন্ট্রি
city_name ASC শহরের_নাম: "সান ফ্রান্সিসকো"
শহরের_নাম DESC শহরের_নাম: "সান ফ্রান্সিসকো"
তাপমাত্রা. গ্রীষ্ম ASC তাপমাত্রা. গ্রীষ্ম: 67
তাপমাত্রা. গ্রীষ্ম DESC তাপমাত্রা. গ্রীষ্ম: 67
তাপমাত্রা. শীতকালে ASC তাপমাত্রা শীতকাল: 55
তাপমাত্রা. শীতকালীন DESC তাপমাত্রা শীতকাল: 55
আশেপাশের অ্যারে ASC ধারণ করে প্রতিবেশী: "মিশন"
আশেপাশের অ্যারে DESC ধারণ করে প্রতিবেশী: "মিশন"
আশেপাশের অ্যারে ASC ধারণ করে আশেপাশের এলাকা: "ডাউনটাউন"
আশেপাশের অ্যারে DESC ধারণ করে আশেপাশের এলাকা: "ডাউনটাউন"
আশেপাশের অ্যারে ASC ধারণ করে প্রতিবেশী: "মারিনা"
আশেপাশের অ্যারে DESC ধারণ করে প্রতিবেশী: "মারিনা"
কম্পোজিট ইনডেক্স এন্ট্রি
city_name ASC, আশেপাশের এলাকা ARRAY শহরের_নাম: "সান ফ্রান্সিসকো", আশেপাশের এলাকা: "মিশন"
city_name ASC, আশেপাশের এলাকা ARRAY শহরের_নাম: "সান ফ্রান্সিসকো", আশেপাশের এলাকা: "ডাউনটাউন"
city_name ASC, আশেপাশের এলাকা ARRAY শহরের_নাম: "সান ফ্রান্সিসকো", আশেপাশের এলাকা: "মারিনা"
city_name DESC, আশেপাশের এলাকা ARRAY৷ শহরের_নাম: "সান ফ্রান্সিসকো", আশেপাশের এলাকা: "মিশন"
city_name DESC, আশেপাশের এলাকা ARRAY৷ শহরের_নাম: "সান ফ্রান্সিসকো", আশেপাশের এলাকা: "ডাউনটাউন"
city_name DESC, আশেপাশের এলাকা ARRAY৷ শহরের_নাম: "সান ফ্রান্সিসকো", আশেপাশের এলাকা: "মারিনা"

সূচক এবং মূল্য নির্ধারণ

সূচকগুলি আপনার অ্যাপ্লিকেশনের স্টোরেজ খরচে অবদান রাখে। ইনডেক্সের স্টোরেজ সাইজ কীভাবে গণনা করা হয় সে সম্পর্কে আরও জানতে, ইনডেক্স এন্ট্রি সাইজ দেখুন।

সূচক একীভূত সুবিধা গ্রহণ

যদিও ক্লাউড ফায়ারস্টোর প্রতিটি প্রশ্নের জন্য একটি সূচক ব্যবহার করে, এটি অগত্যা প্রতি ক্যোয়ারীতে একটি সূচকের প্রয়োজন হয় না। একাধিক সমতা ( == ) ধারা সহ প্রশ্নের জন্য এবং, ঐচ্ছিকভাবে, একটি orderBy ধারা, ক্লাউড ফায়ারস্টোর বিদ্যমান সূচীগুলি পুনরায় ব্যবহার করতে পারে৷ ক্লাউড ফায়ারস্টোর বৃহত্তর সমতা প্রশ্নের জন্য প্রয়োজনীয় যৌগিক সূচক তৈরি করতে সাধারণ সমতা ফিল্টারের জন্য সূচীগুলিকে একত্রিত করতে পারে।

আপনি সূচক একত্রিতকরণের সুবিধা নিতে পারেন এমন পরিস্থিতিতে সনাক্ত করে সূচকের খরচ কমাতে পারেন। উদাহরণস্বরূপ, একটি রেস্টুরেন্ট রেটিং অ্যাপের জন্য একটি 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")

আপনি প্রতিটি প্রশ্নের জন্য একটি সূচক তৈরি করতে পারেন:

সংগ্রহ ক্ষেত্রগুলি সূচীকৃত প্রশ্নের সুযোগ
রেস্টুরেন্ট বিভাগ, star_rating সংগ্রহ
রেস্টুরেন্ট city, star_rating সংগ্রহ
রেস্টুরেন্ট বিভাগ, city, star_rating সংগ্রহ
রেস্টুরেন্ট বিভাগ, city, editors_pick, star_rating সংগ্রহ

একটি ভাল সমাধান হিসাবে, আপনি ক্লাউড ফায়ারস্টোরের সমতা ধারাগুলির জন্য সূচীগুলি একত্রিত করার ক্ষমতার সুবিধা গ্রহণ করে সূচকের সংখ্যা হ্রাস করতে পারেন:

সংগ্রহ ক্ষেত্রগুলি সূচীকৃত প্রশ্নের সুযোগ
রেস্টুরেন্ট বিভাগ, star_rating সংগ্রহ
রেস্টুরেন্ট city, star_rating সংগ্রহ
রেস্টুরেন্ট editors_pick, star_rating সংগ্রহ

সূচীগুলির এই সেটটি কেবল ছোট নয়, এটি একটি অতিরিক্ত ক্যোয়ারী সমর্থন করে:

ওয়েব
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

ইন্ডেক্সিং সীমা

নিম্নলিখিত সীমা সূচী প্রযোজ্য. সমস্ত কোটা এবং সীমার জন্য, কোটা এবং সীমা দেখুন।

সীমা বিস্তারিত
একটি ডাটাবেসের জন্য কম্পোজিট ইনডেক্সের সর্বাধিক সংখ্যা
একটি ডাটাবেসের জন্য একক-ক্ষেত্র কনফিগারেশনের সর্বাধিক সংখ্যা

একটি ক্ষেত্র স্তরের কনফিগারেশন একই ক্ষেত্রের জন্য একাধিক কনফিগারেশন ধারণ করতে পারে। উদাহরণস্বরূপ, একটি একক-ক্ষেত্র সূচীকরণ ছাড় এবং একই ক্ষেত্রে একটি TTL নীতি সীমার দিকে একটি ফিল্ড কনফিগারেশন হিসাবে গণনা করে।

প্রতিটি নথির জন্য সর্বাধিক সংখ্যক সূচক এন্ট্রি

40,000

সূচক এন্ট্রির সংখ্যা হল একটি নথির জন্য নিম্নলিখিতগুলির সমষ্টি:

  • একক-ক্ষেত্র সূচক এন্ট্রির সংখ্যা
  • কম্পোজিট ইনডেক্স এন্ট্রির সংখ্যা

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

একটি যৌগিক সূচকে সর্বাধিক সংখ্যক ক্ষেত্র 100
একটি সূচক এন্ট্রির সর্বোচ্চ আকার

7.5 KiB

ক্লাউড ফায়ারস্টোর কীভাবে সূচক এন্ট্রি আকার গণনা করে তা দেখতে, সূচক এন্ট্রি আকার দেখুন।

একটি ডকুমেন্টের ইনডেক্স এন্ট্রির মাপের সর্বোচ্চ যোগফল

8 MiB

মোট আকার হল একটি নথির জন্য নিম্নলিখিতগুলির সমষ্টি:

  • একটি নথির একক-ক্ষেত্রের সূচকের এন্ট্রির আকারের সমষ্টি৷
  • একটি নথির কম্পোজিট ইনডেক্স এন্ট্রির আকারের সমষ্টি৷
  • একটি ইন্ডেক্স করা ক্ষেত্রের মানের সর্বোচ্চ আকার

    1500 বাইট

    1500 বাইটের বেশি ক্ষেত্রের মানগুলি কাটা হয়েছে৷ ছেঁটে দেওয়া ক্ষেত্রের মান জড়িত প্রশ্নগুলি অসঙ্গত ফলাফল দিতে পারে।

    সূচীকরণের সেরা অনুশীলন

    বেশিরভাগ অ্যাপের জন্য, আপনি আপনার সূচীগুলি পরিচালনা করতে স্বয়ংক্রিয় সূচীকরণ এবং ত্রুটি বার্তা লিঙ্কগুলির উপর নির্ভর করতে পারেন। যাইহোক, আপনি নিম্নলিখিত ক্ষেত্রে একক-ক্ষেত্র ছাড় যোগ করতে চাইতে পারেন:

    মামলা বর্ণনা
    বড় স্ট্রিং ক্ষেত্র

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

    ক্রমিক মান সহ নথি সমন্বিত একটি সংগ্রহে উচ্চ লেখার হার

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

    একটি উচ্চ লেখার হার সহ একটি IoT ব্যবহারের ক্ষেত্রে, উদাহরণস্বরূপ, একটি টাইমস্ট্যাম্প ফিল্ড সহ নথি সমন্বিত একটি সংগ্রহ প্রতি সেকেন্ডে 500 রাইটের কাছে যেতে পারে।

    TTL ক্ষেত্র

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

    বড় অ্যারে বা মানচিত্র ক্ষেত্র

    বড় অ্যারে বা মানচিত্র ক্ষেত্রগুলি প্রতি নথিতে 40,000 সূচক এন্ট্রির সীমার কাছে যেতে পারে। যদি আপনি একটি বড় অ্যারে বা মানচিত্র ক্ষেত্রের উপর ভিত্তি করে অনুসন্ধান না করেন, তাহলে আপনার এটিকে সূচীকরণ থেকে অব্যাহতি দেওয়া উচিত।

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

    কিভাবে ইন্ডেক্সিং সমস্যাগুলি সমাধান করবেন সে সম্পর্কে আরও তথ্যের জন্য (সূচী ফ্যানআউট, INVALID_ARGUMENT ত্রুটি) সমস্যা সমাধানের পৃষ্ঠাটি দেখুন।