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 আপনাকে প্রয়োজনীয় ইনডেক্স শনাক্ত ও তৈরি করতে সাহায্য করে।

আপনি যখনই এমন কোনও কোয়েরি করার চেষ্টা করেন যা কোনও বিদ্যমান ইন্ডেক্স দ্বারা সমর্থিত নয়, 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 নিম্নলিখিত উপায়ে কোয়েরির ফলাফল গণনা করে:

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

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

আপনার জন্য অটোমেটিক সিঙ্গল-ফিল্ড ইন্ডেক্স তৈরি করার মাধ্যমে, 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 "শহরের_নাম: "সান ফ্রান্সিসকো", আশেপাশের এলাকা: "মেরিনা"

ইনডেক্স ও মূল্য

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

ইনডেক্স মার্জিং ব্যবহার করুন

যদিও 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 সমস্যা) কীভাবে সমাধান করবেন সেই সম্পর্কে আরও তথ্য পেতে, সমস্যার সমাধানকরণ পৃষ্ঠা দেখুন।