একাধিক ফিল্ড ওভারভিউতে রেঞ্জ ও অসমতা ফিল্টার সহ কোয়েরি

Cloud Firestore-এ একটি কোয়েরিতে একাধিক ফিল্ডে রেঞ্জ ও ইনইকুয়ালিটি ফিল্টার ব্যবহার করা যায়। আপনি একাধিক ফিল্ডে রেঞ্জ ও অসমতা সংক্রান্ত শর্ত প্রয়োগ করতে পারবেন এবং পোস্ট-ফিল্টারিং লজিক প্রয়োগ করার দায়িত্ব Cloud Firestore-কে দিয়ে আপনার অ্যাপ্লিকেশন ডেভেলপমেন্টের কাজ সহজ করতে পারবেন।

একাধিক ফিল্ডে রেঞ্জ ও অসমতা ফিল্টার

নিম্নলিখিত কোয়েরি জনসংখ্যা এবং ঘনত্বের উপর রেঞ্জ ফিল্টার ব্যবহার করে এমন সমস্ত শহর দেখায় যেখানে জনসংখ্যা ১,০০০,০০০ জনের বেশি এবং জনসংখ্যার ঘনত্ব প্রতি ইউনিট এলাকায় ১০,০০০ জনের কম।

ওয়েব ভার্সন ৯ মডিউলার

const q = query(
    collection(db, "cities"),
    where('population', '>', 1000000),
    where('density', '<', 10000),
  );

Swift

let query = db.collection("cities")
  .whereField("population", isGreaterThan: 1000000)
  .whereField("density", isLessThan: 10000)

Objective-C

FIRQuery *query =
 [[[[self.db collectionWithPath:@"cities"]
queryWhereField:@"population" isGreaterThan:@1000000]
   queryWhereField:@"density" isLessThan:@10000];

Java Android

Query query = db.collection("cities")
 .whereGreaterThan("population", 1000000)
 .whereLessThan("density", 10000);

Kotlin+KTX Android

val query = db.collection("cities")
 .whereGreaterThan("population", 1000000)
 .whereLessThan("density", 10000)

Go

   query := client.Collection("cities").
      Where("population", ">", 1000000).
      Where("density", "<", 10000)

জাভা

db.collection("cities")
  .whereGreaterThan("population", 1000000)
  .whereLessThan("density", 10000);

Node.js

db.collection("cities")
  .where('population', '>', 1000000),
  .where('density', '<', 10000)

Python

from google.cloud import firestore

db = firestore.Client()
query = db.collection("cities")
.where("population", ">", 1000000)
.where("density", "<", 10000)

PHP

$collection = $db->collection('samples/php/cities');
$chainedQuery = $collection
    ->where('population', '>', 1000000)
    ->where('density', '<', 10000);

C#

CollectionReference citiesRef = db.Collection("cities");
Query query = citiesRef
    .WhereGreaterThan("Population", 1000000)
    .WhereLessThan("Density", 10000);
QuerySnapshot querySnapshot = await query.GetSnapshotAsync();
foreach (DocumentSnapshot documentSnapshot in querySnapshot)
{
    var name = documentSnapshot.GetValue<string>("Name");
    var population = documentSnapshot.GetValue<int>("Population");
    var density = documentSnapshot.GetValue<int>("Density");
    Console.WriteLine($"City '{name}' returned by query. Population={population}; Density={density}");
}

Ruby

query = cities_ref.where("population", ">", "1000000")
                  .where("density", "<", 10000)

C++

CollectionReference cities_ref = db->Collection("cities");
Query query = cities_ref.WhereGreaterThan("population", FieldValue::Integer(1000000))
                       .WhereLessThan("density", FieldValue::Integer(10000));

Unity

CollectionReference citiesRef = db.Collection("cities");
Query query = citiesRef.WhereGreaterThan("population", 1000000)
                      .WhereLessThan("density", 10000);

Dart

final citiesRef = FirebaseFirestore.instance.collection('cities')
final query = citiesRef.where("population", isGreaterThan: 1000000)
                  .where("density", isLessThan: 10000);

ইন্ডেক্সিং সংক্রান্ত বিবেচ্য বিষয়

আপনার কোয়েরি রান করার আগে, [কোয়েরি][1] এবং Cloud Firestore [ডেটা মডেল][2] সম্পর্কে পড়ুন।

Cloud Firestore-এ, কোয়েরির ORDER BY ক্লজ নির্ধারণ করে যে কোয়েরি পরিবেশন করার জন্য কোন ইনডেক্স ব্যবহার করা যেতে পারে। যেমন, ORDER BY a ASC, b ASC কোয়েরির জন্য a ASC, b ASC ফিল্ডে কম্পোজিট ইনডেক্স প্রয়োজন।

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

ধরুন, আপনি কর্মচারীদের একটি সংগ্রহ থেকে এমন মার্কিন যুক্তরাষ্ট্রের কর্মচারীদের খুঁজতে চান যাদের বেতন $১০০,০০০-এর বেশি এবং যাদের অভিজ্ঞতার বছর ০-এর বেশি। ডেটাসেট সম্পর্কে আপনার বোঝার উপর ভিত্তি করে, আপনি জানেন যে বেতন সংক্রান্ত সীমাবদ্ধতা অভিজ্ঞতা সংক্রান্ত সীমাবদ্ধতার চেয়ে বেশি বেছে নেওয়া হয়। আদর্শ ইনডেক্স যা ইনডেক্স স্ক্যানের সংখ্যা কমিয়ে দেবে তা হল (salary [...], experience [...])। তাই, দ্রুত এবং সাশ্রয়ী কোয়েরি experience-এর আগে salary-কে অর্ডার করবে এবং নিম্নলিখিতভাবে দেখাবে:

জাভা

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .whereGreaterThan("experience", 0)
  .orderBy("salary")
  .orderBy("experience");

Node.js

db.collection("employees")
  .where("salary", ">", 100000)
  .where("experience", ">", 0)
  .orderBy("salary")
  .orderBy("experience");

Python

db.collection("employees")
  .where("salary", ">", 100000)
  .where("experience", ">", 0)
  .order_by("salary")
  .order_by("experience");

ইনডেক্স অপ্টিমাইজ করার পেশাদার পদ্ধতি

ইনডেক্স অপ্টিমাইজ করার সময়, নিম্নলিখিত পেশাদার পদ্ধতিগুলি মনে রাখবেন।

ইন্ডেক্স ফিল্ডকে সমতা অনুযায়ী সাজান, তারপরে সবচেয়ে বাছাই করা রেঞ্জ বা অসমতা ফিল্ড অনুযায়ী সাজান

Cloud Firestore সমতা সংক্রান্ত সীমাবদ্ধতা এবং orderBy() কোয়েরির প্রথম ফিল্ডে রেঞ্জ বা অসমতা সংক্রান্ত সীমাবদ্ধতা, যদি থাকে, পূরণ করার জন্য কম্পোজিট ইন্ডেক্সের সবচেয়ে বাঁদিকের ফিল্ড ব্যবহার করে। এইসব সীমাবদ্ধতা Cloud Firestore-এর স্ক্যান করা ইন্ডেক্স এন্ট্রির সংখ্যা কমাতে পারে। Cloud Firestore কোয়েরির অন্যান্য রেঞ্জ বা অসমতা সংক্রান্ত সীমাবদ্ধতা পূরণ করতে ইন্ডেক্সের বাকি ফিল্ড ব্যবহার করে। এইসব সীমাবদ্ধতা Cloud Firestore স্ক্যান করে এমন ইন্ডেক্স এন্ট্রির সংখ্যা কমায় না কিন্তু অমিল ডকুমেন্ট ফিল্টার করে যাতে ক্লায়েন্টকে ফেরত দেওয়া ডকুমেন্টের সংখ্যা কমে যায়।

দক্ষ ইনডেক্স তৈরি করার ব্যাপারে আরও তথ্যের জন্য, [ইনডেক্স প্রপার্টি][4] দেখুন।

কোয়েরি কনস্ট্রেন্ট সিলেক্টিভিটির নিম্নক্রমে ফিল্ড সাজান

Cloud Firestore যাতে আপনার কোয়েরির জন্য সবচেয়ে উপযুক্ত ইন্ডেক্স বেছে নেয়, তা নিশ্চিত করতে, এমন একটি orderBy() ক্লজ উল্লেখ করুন যা কোয়েরি কনস্ট্রেন্ট সিলেক্টিভিটির নিম্নক্রম অনুযায়ী ফিল্ড সাজায়। বেশি বেছে নেওয়ার অর্থ হল ডকুমেন্টের ছোট সাবসেট ম্যাচ করা, আর কম বেছে নেওয়ার অর্থ হল ডকুমেন্টের বড় সাবসেট ম্যাচ করা। নিশ্চিত করুন যে আপনি ইন্ডেক্স অর্ডারিংয়ে কম সিলেক্টিভিটি সহ ফিল্ডের আগে বেশি সিলেক্টিভিটি সহ রেঞ্জ বা অসমতা ফিল্ড বেছে নিয়েছেন।

Cloud Firestore নেটওয়ার্কের মাধ্যমে যতগুলি ডকুমেন্ট স্ক্যান করে ও ফেরত পাঠায়, সেই সংখ্যা কমাতে, আপনাকে সবসময় কোয়েরি কনস্ট্রেন্ট সিলেক্টিভিটির নিম্নক্রম অনুযায়ী ফিল্ড সাজাতে হবে। ফলাফলের সেট যদি প্রয়োজনীয় ক্রমে না থাকে এবং ফলাফলের সেট ছোট হবে বলে আশা করা হয়, তাহলে আপনার প্রত্যাশিত ক্রম অনুযায়ী এটি আবার সাজাতে আপনি ক্লায়েন্ট-সাইড লজিক প্রয়োগ করতে পারেন।

যেমন, ধরুন আপনি কর্মচারীদের একটি সংগ্রহ থেকে এমন কর্মচারীদের খুঁজতে চান যারা মার্কিন যুক্তরাষ্ট্রে থাকেন এবং যাদের বেতন $১০০,০০০-এর বেশি এবং আপনি কর্মচারীদের অভিজ্ঞতার বছরের ভিত্তিতে ফলাফল সাজাতে চান। আপনি যদি আশা করেন যে খুব কম সংখ্যক কর্মচারীর বেতন $১০০,০০০-এর বেশি হবে, তাহলে কোয়েরি লেখার সবচেয়ে কার্যকর উপায় হল:

জাভা

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .orderBy("salary")
  .get()
  .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
          // Order results by `experience`
        }
    });;

Node.js

const querySnapshot = await db.collection('employees')
                              .where("salary", ">", 100000)
                              .orderBy("salary")
                              .get();

// Order results by `experience`

Python

results = db.collection("employees")
            .where("salary", ">", 100000)
            .order_by("salary")
            .stream()

// Order results by `experience`

কোয়েরিতে experience-এ অর্ডার যোগ করলে একই সেট ডকুমেন্ট পাওয়া যাবে এবং ক্লায়েন্টে ফলাফল আবার অর্ডার করার প্রয়োজন হবে না, তবে কোয়েরি আগের কোয়েরির চেয়ে অনেক বেশি অপ্রাসঙ্গিক ইন্ডেক্স এন্ট্রি পড়তে পারে। এর কারণ হল Cloud Firestore সবসময় এমন একটি ইন্ডেক্স পছন্দ করে যার ইন্ডেক্স ফিল্ডের প্রিফিক্স কোয়েরির order by ক্লজের সাথে ম্যাচ করে। যদি experience-কে অর্ডার বাই ক্লজে যোগ করা হয়, তাহলে কোয়েরি ফলাফল গণনা করার জন্য Cloud Firestore (experience [...], salary [...]) ইন্ডেক্স বেছে নেবে। যেহেতু experience-এর উপর অন্য কোনও সীমাবদ্ধতা নেই, তাই Cloud Firestore, employees সংগ্রহের সব ইন্ডেক্স এন্ট্রি পড়বে, তারপরে চূড়ান্ত ফলাফল সেট খুঁজে পেতে salary ফিল্টার প্রয়োগ করবে। এর অর্থ হল, যেসব ইনডেক্স এন্ট্রি salary ফিল্টার পূরণ করে না সেগুলি এখনও পড়া হয়, যার ফলে কোয়েরির লেটেন্সি ও খরচ বেড়ে যায়।

মূল্য

একাধিক ফিল্ডে রেঞ্জ ও ইনইকুয়ালিটি ফিল্টার সহ কোয়েরির বিলিং, ডকুমেন্ট রিড ও ইন্ডেক্স এন্ট্রি রিডের উপর ভিত্তি করে করা হয়।

বিস্তারিত তথ্যের জন্য, [দাম][5] পৃষ্ঠা দেখুন।

সীমাবদ্ধতা

[কোয়েরি সংক্রান্ত সীমাবদ্ধতা][6] ছাড়াও, একাধিক ফিল্ডে রেঞ্জ ও ইনইকুয়ালিটি ফিল্টার সহ কোয়েরি ব্যবহার করার আগে নিম্নলিখিত সীমাবদ্ধতাগুলি নোট করুন:

  • ডকুমেন্ট ফিল্ডে রেঞ্জ বা ইনইকুয়ালিটি ফিল্টার সহ কোয়েরি এবং ডকুমেন্ট কীতে (__name__) শুধুমাত্র ইকুয়ালিটি কনস্ট্রেন্ট কাজ করে না।
  • Cloud Firestore-এ রেঞ্জ বা অসমতা ফিল্ডের সংখ্যা ১০-এ সীমাবদ্ধ করা হয়েছে। এটি করা হয় যাতে কোয়েরি রান করার খরচ খুব বেশি না হয়ে যায়।

এর পরে কী করতে হবে

  • [আপনার কোয়েরি অপ্টিমাইজ করা][3] সম্পর্কে জানুন।
  • [সহজ ও জটিল কোয়েরি করা][8] সম্পর্কে আরও জানুন।
  • [Cloud Firestore কীভাবে ইন্ডেক্স ব্যবহার করে][9] তা বুঝুন।

[1]: /docs/firestore/query-data/get-data [2]: /docs/firestore/data-model [3]: /docs/firestore/query-data/multiple-range-optimize-indexes [4]: /docs/firestore/concepts/index-overview#index_properties [5]: /docs/firestore/pricing [6]: /docs/firestore/query-data/queries#query_limitations [7]: https://en.wikipedia.org/wiki/Disjunctive_normal_form [8]: /docs/firestore/query-data/queries [9]: /docs/firestore/concepts/index-overview [10]: /docs/firestore/query-data/multiple-range-optimize-indexes