একাধিক ক্ষেত্রের ওভারভিউতে পরিসীমা এবং অসমতা ফিল্টার সহ ক্যোয়ারী

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

একাধিক ক্ষেত্রে পরিসর এবং অসমতা ফিল্টার

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

ওয়েব সংস্করণ ৯ মডিউলার

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

সুইফট

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

উদ্দেশ্য-সি

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

জাভা অ্যান্ড্রয়েড

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

কোটলিন+কেটিএক্স অ্যান্ড্রয়েড

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

যান

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

জাভা

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

নোড.জেএস

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

পাইথন

from google.cloud import firestore

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

পিএইচপি

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

সি#

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}");
}

রুবি

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

সি++

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

ঐক্য

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

ডার্ট

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

সূচীকরণ বিবেচনা

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

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

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

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

জাভা

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

নোড.জেএস

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

পাইথন

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

সূচক অপ্টিমাইজ করার সর্বোত্তম অনুশীলন

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

সমতা অনুসারে সূচক ক্ষেত্রগুলিকে সাজান, তারপরে সর্বাধিক নির্বাচিত পরিসর বা অসমতা ক্ষেত্রটি সাজান।

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

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

কোয়েরি কনস্ট্রেইন্ট সিলেক্টিভিটির অবরোহী ক্রমে ফিল্ডগুলো সাজান।

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

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

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

জাভা

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

নোড.জেএস

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

// Order results by `experience`

পাইথন

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

// Order results by `experience`

While adding an ordering on experience to the query will yield the same set of documents and obviate re-ordering the results on the clients, the query may read many more extraneous index entries than the earlier query. This is because Cloud Firestore always prefers an index whose index fields prefix match the order by clause of the query. If experience were added to the order by clause, then Cloud Firestore will select the (experience [...], salary [...]) index for computing query results. Since there are no other constraints on experience , Cloud Firestore will read all index entries of the employees collection before applying the salary filter to find the final result set. This means that index entries which don't satisfy the salary filter are still read, thus increasing the latency and cost of the query.

মূল্য নির্ধারণ

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

বিস্তারিত তথ্যের জন্য মূল্য নির্ধারণ পৃষ্ঠাটি দেখুন।

সীমাবদ্ধতা

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

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

এরপর কী?