2016-06-24 7 views
11

चलो कहते हैं कि इस प्रकार मैं कुछ डेटा है दो:फायरबेस के साथ बच्चे के मूल्य से अवरोही क्रम में मैं कैसे जा सकता हूं?

{ 
    "name": "post #1", 
    "votes": 100 
}, 
{ 
    "name": "post #2", 
    "votes": 10000 
}, 
{ 
    "name": "post #3", 
    "votes": 750 
} 

और इतने पर।

फायरबेस में डेटा स्पष्ट रूप से वोटों द्वारा आदेश नहीं दिया जाता है, यह कुंजी द्वारा आदेश है।

मैं इस डेटा को उतरने के क्रम में वोटों की संख्या से पैगनेट करने में सक्षम होना चाहता हूं।

मुझे लगता है कि मैं कुछ ऐसा कर दिया था:

ref.orderByChild('votes') 
    .startAt(someValue) 
    .limitToFirst(someOtherValue) 
    .once('value', function(snapshot) { 
     resolve(snapshot); 
    }); 

या शायद, मैं limitToLast, और endAt उपयोग करने की आवश्यकता होगी?

key द्वारा अंकन काफी आसान है, लेकिन यह मुझे रोक रहा है।

अद्यतन (2017/10/16): Firebase हाल ही में घोषणा Firestore - उनकी पूरी तरह से प्रबंधित NoSQL डेटासंग्रह जो यह आसान और अधिक जटिल प्रश्नों करने के लिए करना चाहिए। अभी भी कुछ उपयोग मामले हो सकते हैं जहां कोई भी हमेशा प्रदान किए गए रीयलटाइम डेटाबेस का उपयोग कर सकता है। यदि आप उन लोगों में से एक हैं तो यह प्रश्न अभी भी लागू होना चाहिए।

+0

देखें http://stackoverflow.com/questions/27195851/how-to-retrieve-paginated-children-in-ascending-or-descending-order-in-firebase/33484784#33484784 –

+0

@FrankvanPuffelen आपका लिंक करने के लिए है एक सवाल जो नीचे मेरे उत्तर पर वापस लिंक करता है। क्या आप लोग इस जानकारी को फायरबेस डॉक्स में जोड़ने पर विचार कर सकते हैं? –

उत्तर

23

मैंने कोडिंग के लंबे दिन के बाद इस प्रश्न को पोस्ट किया और मेरा दिमाग मशरूम था।

मैंने आज सुबह एक और दरार ली, और जैसा कि अक्सर होता है, समाधान को जल्दी से ढूंढने में सक्षम था।

समाधान:

आदेश डेटा पृष्ठ पर अंक लगाना करने के लिए हम मनमाने ढंग से एक सूची के मध्य से क्रमबद्ध डेटा खींचने की क्षमता की जरूरत है। आप firebase एपीआई द्वारा प्रदान की निम्नलिखित कार्यों का उपयोग कर ऐसा कर सकते हैं:

startAt

endAt

limitToFirst

limitToLast

अधिक जानकारी here पाया जा सकता है।

मेरे मामले में, क्योंकि मुझे अवरोही क्रम में अपने डेटा की आवश्यकता है, इसलिए मैं endAt और limitToLast का उपयोग करूंगा।

मान लीजिए कि मैं अपने प्रत्येक पृष्ठ को पांच आइटम रखना चाहता हूं। मैं तो जैसे मेरी पहली क्वेरी लिखते थे:

ref.orderByChild('votes') 
    .limitToLast(5) 
    .once('value', function(snapshot) { 
     console.log('Snap: ', snapshot.val()); 
    }); 

यह उच्चतम वोटों की संख्या के साथ 5 आइटम हो जाता है।

अगला पृष्ठ प्राप्त करने के लिए, हमें दो हमारे अंतिम प्रश्न के परिणामों से डेटा के टुकड़े स्टोर करने की आवश्यकता होगी।हमें वोटों की संख्या को स्टोर करने की आवश्यकता है, और उस आइटम के लिए कुंजी जिसमें कम से कम वोट थे। यही कहना है, हमारी सूची में आखिरी वस्तु।

ref.orderByChild('votes') 
    .endAt(previousVoteCount, previousKey) 
    .limitToLast(5) 
    .once('value', function(snapshot) { 
     console.log('Snap: ', snapshot.val()); 
    }); 

आपने इस क्वेरी मैं endAt जोड़ा में दिखाई देंगे:

कि डेटा, हमारी अगली क्वेरी, और बाद में सभी प्रश्नों का उपयोग करना, निम्नानुसार दिखेंगे। यह अगले 5 आइटमों को पिछली सूची में पिछले एक से शुरू होने वाले सबसे अधिक वोट प्राप्त करता है। हमें पिछली सूची में अंतिम आइटम की कुंजी शामिल करनी चाहिए ताकि यदि समान संख्या में वोटों के साथ कई आइटम हों, तो यह सही आइटम से शुरू होने वाली सूची लौटाएगा, और उस नंबर के साथ पहली बार नहीं मिलेगा वोटों की, जो प्रारंभिक क्वेरी से मिली सूची के बीच में कहीं भी हो सकती है।

यही है!

+0

क्या यह समाधान कई समान मूल्यों के साथ काम करता है? उदाहरण के लिए निम्नलिखित स्कोर: [5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7]। वास्तविक दुनिया परिदृश्य में, कई उच्च वोट वाली पोस्ट एक ही मूल्य साझा नहीं करेंगे, लेकिन बहुत कम स्कोर मूल्य होंगे। उपरोक्त @ फ्रैंक-वैन-पफेलन द्वारा हाइलाइट किए गए मेरे SO प्रश्न में इस मुद्दे पर टिप्पणी की गई है। – Pandaiolo

+0

मान लीजिए कि आप फायरबेस कुंजी के साथ एक ही सूची में अपना डेटा संग्रहीत कर रहे हैं, तो आदेश का ऑर्डरबिल्ड हिस्सा पहले 'वोट' द्वारा क्रमबद्ध होगा, फिर उसी संख्या के साथ कई पोस्ट होनी चाहिए, यह कुंजी द्वारा क्रमबद्ध होगी। –

+1

तो इसका मतलब है, यदि आप क्वेरी के 'endAt' भाग में 'पिछलीकी' तर्क शामिल करते हैं, तो आप सटीक रूप से पेजिंग कर पाएंगे। –

संबंधित मुद्दे