फायरबेस की क्वेरी एपीआई का उपयोग करते हुए , आप इसे आज़मा सकते हैं:
// !!! 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());
});
लेकिन जैसा कि Firebase से @RobDiMarco टिप्पणियों में कहता है:
एकाधिक 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);
}
});
2. एक संपत्ति जोड़ें जो उन मूल्यों को जोड़ती है जिन्हें आप फ़िल्टर करना चाहते हैं
यदि यह काफी अच्छा नहीं है, तो आपको अपने उपयोग-मामले की अनुमति देने के लिए अपने डेटा को संशोधित / विस्तारित करने पर विचार करना चाहिए। उदाहरण के लिए: आप शैली को एक एकल संपत्ति में ले जा सकते हैं, जिसे आप इस फिल्टर के लिए उपयोग करते हैं।
"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);
});
डेविड ईस्ट ने QueryBase नामक एक पुस्तकालय लिखा है जो इस तरह के गुणों को उत्पन्न करने में मदद करता है ।
आप रिश्तेदार / श्रेणी प्रश्न भी कर सकते हैं, मान लीजिए कि आप श्रेणी और वर्ष के अनुसार फिल्मों की अनुमति देना चाहते हैं। आप इस डेटा संरचना का उपयोग करेंगे:
"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"
। इस तरह से लेज़रोग्राफ़िक ऑर्डर जो फायरबेस स्ट्रिंग मूल्यों पर करता है, कालानुक्रमिक क्रम के समान होगा।
एक संपत्ति में मूल्यों का यह संयोजन दो से अधिक मूल्यों के साथ काम कर सकता है, लेकिन आप केवल संयुक्त संपत्ति के अंतिम मूल्य पर एक सीमा फ़िल्टर कर सकते हैं।
इसका एक बहुत ही विशेष संस्करण फायरबेस के लिए जियोफायर लाइब्रेरी द्वारा लागू किया गया है । यह लाइब्रेरी किसी स्थान के अक्षांश और देशांतर को तथाकथित जिय्हाश में जोड़ती है , जिसका उपयोग फिर फायरबेस पर रियलटाइम रेंज क्वेरी करने के लिए किया जा सकता है।
3. प्रोग्रामेटिक रूप से एक कस्टम इंडेक्स बनाएं
फिर भी एक और विकल्प यह है कि इस नए क्वेरी एपीआई के जुड़ने से पहले हमने जो किया है, वह करें: एक अलग नोड में एक इंडेक्स बनाएं:
"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()
कॉल में त्रुटि होगी, क्योंकि ग्राहक वर्तमान में अप्रत्याशित परिणाम देते हैं। यह संभव है कि यह संयोग से आपके परीक्षण में काम आए, लेकिन इसे उदारतापूर्वक काम करने के लिए नहीं बनाया गया है (हालांकि हम इसे जोड़ना पसंद करेंगे!)।