firebase - फायरबेस में खंड जहां एकाधिक पर आधारित क्वेरी




firebase-database (2)

मैंने एक व्यक्तिगत लाइब्रेरी लिखी है जो आपको सर्वर पर किए गए सभी ऑर्डर के साथ कई मानों द्वारा ऑर्डर करने की अनुमति देती है।

Querybase से मिलें!

Querybase फ़ायरबेस डेटाबेस संदर्भ और उन फ़ील्ड की एक सरणी लेता है जिन्हें आप अनुक्रमित करना चाहते हैं। जब आप नए रिकॉर्ड बनाते हैं तो यह स्वचालित रूप से कुंजी की पीढ़ी को संभाल लेगा जो एकाधिक क्वेरीिंग की अनुमति देता है। चेतावनी यह है कि यह केवल सीधे समकक्ष का समर्थन करता है (इससे कम या उससे अधिक नहीं)।

const databaseRef = firebase.database().ref().child('people');
const querybaseRef = querybase.ref(databaseRef, ['name', 'age', 'location']);

// Automatically handles composite keys
querybaseRef.push({ 
  name: 'David',
  age: 27,
  location: 'SF'
});

// Find records by multiple fields
// returns a Firebase Database ref
const queriedDbRef = querybaseRef
 .where({
   name: 'David',
   age: 27
 });

// Listen for realtime updates
queriedDbRef.on('value', snap => console.log(snap));
{
"movies": {
    "movie1": {
        "genre": "comedy",
        "name": "As good as it gets",
        "lead": "Jack Nicholson"
    },
    "movie2": {
        "genre": "Horror",
        "name": "The Shining",
        "lead": "Jack Nicholson"
    },
    "movie3": {
        "genre": "comedy",
        "name": "The Mask",
        "lead": "Jim Carrey"
    }
  }  
 }

मैं एक फायरबेस न्यूबी हूँ। मैं उपरोक्त डेटा से परिणाम कैसे प्राप्त कर सकता हूं जहां genre = 'comedy' और lead = 'Jack Nicholson' ?

आपके पास कौन से विकल्प हैं?


फायरबेस की नई क्वेरी एपीआई का उपयोग करके, आप इसे आजमा सकते हैं:

// !!! 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()); 
  });

लेकिन फायरबेस के @RobDiMarco टिप्पणियों में कहते हैं:

एकाधिक orderBy() कॉल एक त्रुटि फेंक देंगे

तो ऊपर मेरा कोड काम नहीं करेगा

मैं तीन दृष्टिकोणों के बारे में जानता हूं जो काम करेंगे।

1. सर्वर पर सबसे अधिक फ़िल्टर करें, बाकी क्लाइंट पर करें

आप क्या कर सकते हैं एक orderBy().startAt()./endAt() निष्पादित करें 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);
  });

डेविड ईस्ट ने क्वेरीबेज नामक एक लाइब्रेरी लिखी है जो ऐसी संपत्तियों को उत्पन्न करने में मदद करती है

आप सापेक्ष / रेंज प्रश्न भी कर सकते हैं, मान लीजिए कि आप श्रेणी और वर्ष के आधार पर पूछताछ फिल्मों को अनुमति देना चाहते हैं। आप इस डेटा संरचना का उपयोग करेंगे:

"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" । इस तरह लेक्सिकोग्राफिकल ऑर्डरिंग कि फायरबेस, स्ट्रिंग मानों पर करता है, क्रोनोलॉजिकल ऑर्डरिंग जैसा ही होगा।

संपत्ति में मूल्यों का यह संयोजन दो से अधिक मानों के साथ काम कर सकता है, लेकिन आप समग्र संपत्ति में अंतिम मूल्य पर केवल एक श्रेणी फ़िल्टर कर सकते हैं।

इसका एक बहुत ही विशेष संस्करण फायरबेस के लिए जियोफायर लाइब्रेरी द्वारा कार्यान्वित किया जाता है। यह लाइब्रेरी एक स्थान के अक्षांश और देशांतर को तथाकथित Geohash , जिसका उपयोग Geohash पर रीयलटाइम रेंज क्वेरी करने के लिए किया जा सकता है।

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://.com/a/34105063