2017-06-10 7 views
7

मैं इस डेटाबेस है, जो इस enter image description hereमैं इस डेटाबेस के माध्यम से लूप कैसे करूं और बच्चे के मूल्य कैसे प्राप्त करूं?

तो पहले चाबियाँ उपयोगकर्ता uid प्रमाणन से लिया जाता है की तरह लग रहा है, और उसके बाद उपयोगकर्ता नाम वह/वह प्रदान की है और क्या वे एक मैच के लिए स्कोर किया भी लिया जाता है ..

मैं सिर्फ प्रत्येक उपयोगकर्ता कुल अंक प्राप्त करना चाहता था - रे कुल अंक और है लकड़ी कुल अंक है उदाहरण के लिए लेकिन सभी डॉक्स के लिए जाने के बाद भी मैं बस के लिए था ऐसा करने में सक्षम था एक उपयोगकर्ता, मुझे प्रत्येक को लिखना है उपयोगकर्ता नाम और मूल्य प्राप्त करने के लिए प्रत्येक पंक्ति के लिए विशिष्ट मिलान .. अब सोचें कि यह कैसे होगा यदि वे दर्जनों उपयोगकर्ता हैं? हम्म लाइनों का एक बहुत ..

यहाँ

JSON

जावास्क्रिप्ट कोड

var query = firebase.database().ref(); 
query.once("value") 
.then(function(snapshot) { 
snapshot.forEach(function(childSnapshot) { 

    var key = childSnapshot.key;  
    var Data1 = childSnapshot.child("Ray/Match1/Points").val(); 
    var Data2 = childSnapshot.child("Ray/Match2/Points").val(); 
    console.log(Data1 + Data2); 
    }); 
}) 

जो मुझे प्रदर्शित करते हैं, रे कुल अंक दूँगी है, लेकिन नहीं लकड़ी के लिए स्पष्ट रूप से मैं यह दोहराना और इसे लिखें ..

तो मैं इसे कैसे हल करूं?

+0

इस सवाल का एक प्रकार है जहां firebase बादल कार्यों outshines हर दूसरे दृश्यपटल कार्यान्वयन है: यहाँ सिर्फ इतना है कि प्राप्त करने के लिए एक उदाहरण कोड है, तो आप किसी विशेष Firebase सुविधा, बस अच्छे पुराने जावास्क्रिप्ट पाश के लिए-की जरूरत नहीं है। –

उत्तर

3

बस अपने डाटाबेस

|_Id 
    |_ $userId: 
    |  |_ Ray 
    |  | |_ Match1:24 
    |  | |_ Match2:21 
    |  |_ total:45 

को कुल नोड जोड़ने और फिर कुल user`s

var query = firebase.database().ref(); 
query.once("value") 
.then(function(snapshot) { 
snapshot.forEach(function(childSnapshot) { 
    var total = childSnapshot.child("total").val(); 
    console.log(total); 
    }); 
}) 

आप कुल नोड का उपयोग कर cloud functions

+0

महान उत्तर मोहम्मद। हालांकि मैं एक बदलाव करूँगा और कुल स्कोर को मैच परिणामों से अलग कर दूंगा, ताकि आप सभी उपयोगकर्ताओं के लिए कुल स्कोर प्राप्त कर सकें। तो '/ TotalScores/$ uid/45' –

+0

क्या यह एकमात्र तरीका है जिसे हम कर सकते हैं? क्लाउड फ़ंक्शन के माध्यम से? मैं बस एक साधारण स्थैतिक साइट बनाना चाहता हूं तो एक और तरीका होना चाहिए? – skyline33

+0

आपकी समस्याओं को हल करने के लिए हमेशा कई तरीके हैं। लेकिन मुझे लगता है कि बैकएंड में आपके तर्क को लागू करने के लिए यह अधिक सुविधाजनक है (आपके मामले में एक साधारण नोड फ़ंक्शन)। वैकल्पिक रूप से आप प्रत्येक बार अपने डेटाबेस में एक मैच सहेजने पर कुल अंक जोड़ सकते हैं। –

5

मैं एक दृष्टि डाली जोड़ सकते हैं मिलता है आपकी समस्या पर और मुझे लगता है कि मेरा समाधान है, या आपके समाधान के लिए कम से कम एक पाथवे है। ठीक है, सबसे पहले मैं मूल समस्या की व्याख्या करूंगा, फिर मैं आपको कुछ जेनेरिक-आश कोड प्रदान करने का प्रयास करूंगा (मैं आपके द्वारा उपयोग किए जाने वाले कुछ चर का उपयोग करने का प्रयास करूंगा)। और दूर हम जाओ!

मूल रूप से मैं क्या देख 2 कदम है ...

कदम 1 - आप एक "निर्माता समारोह" है कि अपने स्वयं के नाम (और/या यूजर आईडी) और अपने स्वयं के साथ नया उपयोगकर्ता वस्तुओं का निर्माण करेगा उपयोग करने की आवश्यकता गुणों का सेट।

सोच की उस पंक्ति के साथ, आप रचनाकार फ़ंक्शन में "उपयोगकर्ता नाम", "मिलान बिंदु 1", "मिलान बिंदु 2" जैसे गुण शामिल हो सकते हैं और फिर एक फ़ंक्शन जो प्रत्येक नाम के सारांश को लॉग करता है और उनके मैच पॉइंट्स 1 और 2. से 0 अंक 2.

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

तो ... और चलो गहरी सांस लें क्योंकि यह बहुत सारे शब्द थे ... चलो इसे कोड करने का प्रयास करें। मैं जेनेरिक गुणों का इस तरह से उपयोग करूंगा कि मुझे लगता है कि आपके लिए अपनी संपत्ति/चर नामों को सम्मिलित करना आसान हो जाएगा।

var user = function(name, match1, match2){ 
    this.name = name; 
    this.match1 = match1; 
    this.match2 = match2; 
    this.pointTotal = function(match1, match2) { 
     console.log(match1 + match2);}; 
    this.summary = function(){ 
      console.log(name + " has a total of " + pointTotal + " 
points.");}; 
} 

कोड का "यह" भाग किसी भी उपयोगकर्ता नाम का उपयोग करने की अनुमति देता है न केवल विशिष्ट।

ठीक है, तो उपरोक्त कोड इस मुद्दे के निर्माता कार्य भाग का ख्याल रखता है। अब इससे कोई फ़र्क नहीं पड़ता कि आपको अद्वितीय नामों के साथ कितने उपयोगकर्ता बनाने की आवश्यकता है।

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

फिर से, मैं सामान्य-ish संपत्ति/चर नाम का उपयोग करेगा ...

var key = childSnapshot.key; 

while(i = 0; i < key.length + 1; i++) { 

    var user = function(name, match1, match2){ 
     this.name = name; 
     this.match1 = match1; 
     this.match2 = match2; 
     this.pointTotal = function(match1, match2) { 
      console.log(match1 + match2);}; 
     this.summary = function(){ 
      console.log(name + " has a total of " + pointTotal + " points.");}; 
    } 
} 

शब्द की एक पूरी बहुत कुछ और कोड है कि सामान्य संपत्ति के नाम/चर की और संपत्ति नामों में से/एक संकर है आपके द्वारा उपयोग किए जाने वाले चर, लेकिन मुझे यकीन है कि मैं सही रास्ते पर हूं।

मुझे बहुत विश्वास है कि यदि आपने कोड और विस्तार प्रदान किया है, तो यदि आप अपने स्वयं के चरों को प्लग करते हैं तो आपको वह समाधान मिल जाएगा जो आपको चाहिए।

बंद होने में मैं बस यह कहना चाहता हूं कि मैं वास्तव में आशा करता हूं कि मदद करता है और अगर मैं समस्या को हल करने में मदद नहीं करना चाहता हूं, तो मुझे अभ्यास की आवश्यकता है। मैं अजीब घंटे में नौकरी काम करते हैं और यदि ऐसा है तो मैं अभी जवाब नहीं मैं अपने काम :(

गुड लक पर की संभावना है और मुझे आशा है कि मैं मदद की!

+0

ऐसा लगता है कि मोहम्मद ने मुझे पंच पर मार दिया और एक बहुत ही सरल समाधान के साथ! मैं अपने जवाब को इंजीनियर कर दूंगा ताकि मैं इसे अपने लिए समझ सकूं। अरे ... ब्रावो मोहम्मद! :) –

+0

इसे लिखने के लिए अपना समय लेने के लिए धन्यवाद, क्या आप मुझे जेसन का एक उदाहरण दिखा सकते हैं? क्या आपका मतलब इस तरह है https://jsonblob.com/f22313a3-4e29-11e7-ae4c-096d61fc72e0 – skyline33

+0

अरे आकाशगंगा! दुर्भाग्यवश, मुझे यह कहने में शर्मिंदा है कि मुझे अभी तक जेसन के बारे में पहली बात नहीं पता है। मुझे बस एचटीएमएल, सीएसएस और जावास्क्रिप्ट पता है, लेकिन मुझे जावास्क्रिप्ट के साथ बहुत सहजता मिल रही है और आपकी समस्या में जावास्क्रिप्ट को पहचाना गया और देखा कि यह कैसे हल किया जा सकता था। –

2

इस कार्यान्वयन चेक बाहर। बादल के लिए कोई ज़रूरत नहीं समारोह।

firebase().database().ref().on('value', function(snapshot) { 
snapshot.forEach((user)=>{ 

    user.forEach((matches)=> { 
    var total = 0; 
    matches.forEach((match)=> {  
     total += match.val().Points;   
    }); 
    console.log(total);       
    });  

    }); 
}) 
+1

हालांकि यह सही है, यह इष्टतम नहीं है क्योंकि आपको आगे के अंत में लूप की आवश्यकता है। मोहम्मद बेहतर है क्योंकि यह ऐप से तर्क को छुपाता है (अधिक सुरक्षित)। इसके अलावा, फायरबेस एक नोस्कल डेटाबेस है। तो, इष्टतम समाधान के लिए nosql बिंदु दृश्य से इसे संपर्क करना बेहतर होगा। –

1

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

{ 
    a1230scfkls1240: { 
    userinfo: { 
     username: 'Joe' 
    }, 
    matches: { 
     asflk12405: { 
     points: 123 
     }, 
     isdf534853: { 
     points: 345 
     } 
    } 
    } 
} 

अब, कुल अंक के लिए हो रही एक सा और अधिक सरल लगता है ना, करता है: यहाँ Firebase वस्तु संरचना का एक जावास्क्रिप्ट प्रतिनिधित्व है?

अपनी वर्तमान डेटाबेस संरचना को संशोधित किए बिना आपकी सहायता करने के लिए, आपको बस अपने उपयोगकर्ता में सभी उपयोगकर्ता आईडी + उपयोगकर्ता नाम + मिलान क्रमपरिवर्तन के माध्यम से लूप करना होगा।

const query = firebase.database().ref(); 

query.once('value') 
.then(snapshot => { 
    const points = {} 
    const users = snapshot.val() 

    for (const userId of Object.keys(users)) { 
    const userprofile = users[userId] 

    for (const username of Object.keys(userprofile)) { 
     const user = userprofile[username] 

     for (const matchId of Object.keys(user)) { 
     const match = user[matchId] 
     // Store the points per user, per profile, or per both, depending on your needs 
     points[username] = points[username] === undefined 
      ? points[username] = match.points 
      : points[username] += match.points 
     } 
    } 
    } 
}) 
संबंधित मुद्दे

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