ফায়ারবেসের ক্যোয়ারী এপিআই ব্যবহার করে , আপনি এটি চেষ্টা করতে প্ররোচিত হতে পারেন:
// !!! THIS WILL NOT WORK !!!
ref
.orderBy('genre')
.startAt('comedy').endAt('comedy')
.orderBy('lead') // !!! THIS LINE WILL RAISE AN ERROR !!!
.startAt('Jack Nicholson').endAt('Jack Nicholson')
.on('value', function(snapshot) {
console.log(snapshot.val());
});
তবে ফায়ারবেস থেকে @ রবডিমার্কো মন্তব্যগুলিতে বলেছেন:
একাধিক orderBy()
কল একটি ত্রুটি নিক্ষেপ করবে
সুতরাং উপরের আমার কোডটি কাজ করবে না ।
আমি তিনটি পদ্ধতির জানি যা কাজ করবে।
1. সার্ভারে সর্বাধিক ফিল্টার করুন, ক্লায়েন্টের উপর বাকীটি করুন
আপনি যা করতে পারেন তা হ'ল orderBy().startAt()./endAt()
সার্ভারে একটি কার্যকর করা, অবশিষ্ট ডেটাটি টানুন এবং এটি আপনার ক্লায়েন্টের জাভাস্ক্রিপ্ট কোডে ফিল্টার করুন।
ref
.orderBy('genre')
.equalTo('comedy')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
if (movie.lead == 'Jack Nicholson') {
console.log(movie);
}
});
২. এমন একটি বৈশিষ্ট্য যুক্ত করুন যা আপনি যে মানগুলিতে ফিল্টার করতে চান তার সাথে মিলিত হয়
যদি এটি যথেষ্ট ভাল না হয় তবে আপনার ব্যবহারের ক্ষেত্রে আপনার অনুমতি দেওয়ার জন্য আপনার ডেটা সংশোধন / প্রসারিত করার কথা বিবেচনা করা উচিত। উদাহরণস্বরূপ: আপনি জেনার + লিড স্টাফ করতে পারেন এমন একক সম্পত্তি যা আপনি এই ফিল্টারটির জন্য ব্যবহার করেন property
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_lead": "comedy_Jack Nicholson"
},...
আপনি মূলত নিজের মাল্টি-কলাম-ইনডেক্সটি সেভাবেই তৈরি করছেন এবং এটি দিয়ে এটি সম্পর্কে জিজ্ঞাসা করতে পারেন:
ref
.orderBy('genre_lead')
.equalTo('comedy_Jack Nicholson')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
ডেভিড ইস্ট কোয়েরিবেস নামে একটি গ্রন্থাগার লিখেছেন যা এই জাতীয় বৈশিষ্ট্য তৈরিতে সহায়তা করে ।
এমনকি আপনি আপেক্ষিক / ব্যাপ্তি অনুসন্ধান করতে পারেন, আসুন আমরা বলি যে আপনি বিভাগ এবং বছর অনুসারে মুভিগুলির অনুসন্ধানের অনুমতি দিতে চান। আপনি এই ডেটা কাঠামোটি ব্যবহার করবেন:
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_year": "comedy_1997"
},...
এবং তারপরে 90 এর দশকের কমেডিগুলির জন্য জিজ্ঞাসা করুন:
ref
.orderBy('genre_year')
.startAt('comedy_1990')
.endAt('comedy_2000')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
যদি আপনাকে কেবল বছরের চেয়ে বেশি বছরের জন্য ফিল্টার করতে হয় তবে অন্যান্য তারিখের অংশগুলি অবতরণে যুক্ত করার বিষয়টি নিশ্চিত করুন, যেমন "comedy_1997-12-25"
। ফায়ারবেস স্ট্রিংয়ের মানগুলিতে যেভাবে ডিকোসোগ্রাফিকাল ক্রম হয় তা কালানুক্রমিক ক্রম হিসাবে একই হবে।
কোনও সম্পত্তির মানগুলির সংমিশ্রণটি দুটিরও বেশি মানের সাথে কাজ করতে পারে তবে আপনি কেবল সম্মিলিত সম্পত্তিতে সর্বশেষ মানটিতে একটি পরিসীমা ফিল্টার করতে পারেন।
এর একটি খুব বিশেষ রূপটি ফায়ারবেসের জন্য জিওফায়ার লাইব্রেরি দ্বারা প্রয়োগ করা হয়েছে । এই গ্রন্থাগারটি একটি তথাকথিত দ্রাঘিমাংশ এবং দ্রাঘিমাংশকে তথাকথিত জিওহ্যাশের সাথে সংযুক্ত করে , যা ফায়ারবেসে রিয়েলটাইম রেঞ্জ অনুসন্ধান করতে ব্যবহৃত হতে পারে।
৩. প্রোগ্রাম হিসাবে কাস্টম সূচক তৈরি করুন
তবুও আরেকটি বিকল্প হ'ল এই নতুন কোয়েরি এপিআই যুক্ত হওয়ার আগে আমরা যা করেছি তা করা: একটি ভিন্ন নোডে একটি সূচক তৈরি করুন:
"movies"
// the same structure you have today
"by_genre"
"comedy"
"by_lead"
"Jack Nicholson"
"movie1"
"Jim Carrey"
"movie3"
"Horror"
"by_lead"
"Jack Nicholson"
"movie2"
সম্ভবত আরও পন্থা আছে। উদাহরণস্বরূপ, এই উত্তরটি একটি বিকল্প গাছ-আকৃতির কাস্টম সূচককে হাইলাইট করে: https://stackoverflow.com/a/34105063
orderBy()
কল একটি ত্রুটি ছুঁড়ে দেবে, কারণ ক্লায়েন্টরা বর্তমানে অপ্রত্যাশিত ফলাফল দেয়। এটা সম্ভব যে এটি কাকতালীয়ভাবে আপনার পরীক্ষায় কাজ করেছে, তবে এটি সাধারণভাবে কাজ করার জন্য নির্মিত হয়নি (যদিও আমরা এটি যুক্ত করতে চাই!)।