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)
পিএইচপি
সি#
রুবি
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`
যদিও কোয়েরিতে experience উপর ভিত্তি করে একটি ক্রম যোগ করলে একই ডকুমেন্ট সেট পাওয়া যায় এবং ক্লায়েন্টগুলিতে ফলাফল পুনর্বিন্যাস করার প্রয়োজন হয় না, তবুও কোয়েরিটি আগের কোয়েরির চেয়ে অনেক বেশি অপ্রয়োজনীয় ইনডেক্স এন্ট্রি পড়তে পারে। এর কারণ হলো, Cloud Firestore সবসময় এমন একটি ইনডেক্সকে অগ্রাধিকার দেয় যার ইনডেক্স ফিল্ড প্রিফিক্স কোয়েরির 'অর্ডার বাই' ক্লজের সাথে মেলে। যদি 'অর্ডার বাই' ক্লজে experience যোগ করা হয়, তাহলে Cloud Firestore কোয়েরির ফলাফল গণনা করার জন্য (experience [...], salary [...]) ইনডেক্সটি নির্বাচন করবে। যেহেতু experience উপর অন্য কোনো সীমাবদ্ধতা নেই, তাই Cloud Firestore চূড়ান্ত ফলাফল সেট খুঁজে বের করার জন্য salary ফিল্টার প্রয়োগ করার আগে employees কালেকশনের সমস্ত ইনডেক্স এন্ট্রি পড়ে নেবে। এর মানে হলো, যে ইনডেক্স এন্ট্রিগুলো salary ফিল্টার পূরণ করে না, সেগুলোও পড়া হয়, ফলে কোয়েরির ল্যাটেন্সি এবং খরচ বেড়ে যায়।
মূল্য নির্ধারণ
একাধিক ফিল্ডে রেঞ্জ এবং ইনইকুয়ালিটি ফিল্টার ব্যবহার করে করা কোয়েরির বিল, পঠিত ডকুমেন্ট এবং পঠিত ইনডেক্স এন্ট্রির সংখ্যার উপর ভিত্তি করে ধার্য করা হয়।
বিস্তারিত তথ্যের জন্য মূল্য নির্ধারণ পৃষ্ঠাটি দেখুন।
সীমাবদ্ধতা
কোয়েরির সীমাবদ্ধতাগুলো ছাড়াও, একাধিক ফিল্ডে রেঞ্জ এবং ইনইকুয়ালিটি ফিল্টারসহ কোয়েরি ব্যবহার করার আগে নিম্নলিখিত সীমাবদ্ধতাগুলো লক্ষ্য করুন:
- ডকুমেন্ট ফিল্ডে রেঞ্জ বা ইনইকুয়ালিটি ফিল্টার এবং শুধুমাত্র ডকুমেন্ট কী
(__name__)-তে ইকুয়ালিটি কনস্ট্রেইন্ট সহ কোয়েরি সমর্থিত নয়। - Cloud Firestore রেঞ্জ বা ইনইকুয়ালিটি ফিল্ডের সংখ্যা ১০-এ সীমাবদ্ধ রাখে। এর উদ্দেশ্য হলো কোয়েরি চালানোকে অতিরিক্ত ব্যয়বহুল হওয়া থেকে প্রতিরোধ করা।
এরপর কী?
- আপনার কোয়েরি অপ্টিমাইজ করার বিষয়ে জানুন।
- সরল এবং যৌগিক কোয়েরি সম্পাদন সম্পর্কে আরও জানুন।
- Cloud Firestore কীভাবে ইনডেক্স ব্যবহার করে তা বুঝুন।