2017-06-10 17 views
7

mam tę bazę danych, która wygląda jak ten enter image description herew jaki sposób przełączyć się przez tę bazę danych i uzyskać wartości podrzędne?

więc pierwsze klucze są uid użytkownika pobranych z autoryzacją, a następnie nazwę użytkownika on/ona pod warunkiem, i co oni zdobyć dla każdego meczu są brane również ..

chciałem dostać każdy użytkownik sumę punktów - na przykład Ray suma punktów jest i Wood suma punktów jest ale po pominie do docs wszystko udało mi się zrobić to tylko dla jeden użytkownik, muszę napisać każdy nazwa użytkownika i konkretne dopasowanie dla każdej linii, aby uzyskać wartość .. teraz pomyśl, jak to będzie, jeśli są dziesiątkami użytkowników? hmm wiele linii ..

oto JSON

kod javascript

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); 
    }); 
}) 

który pozwoli mi wyświetlać Ray sumę punktów, ale nie dla Wood oczywiście muszę to powtórzyć i napisz to ..

Jak mogę to rozwiązać?

+0

Jest to rodzaj pytanie gdzie Firebase funkcje cloud przyćmiewa wszystkie inne wykonanie frontend. –

Odpowiedz

3

prostu dodać całkowitego węzeł do db

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

a następnie dostać Klubowicza sumie

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

można dodać całkowitą węzeł przy użyciu cloud functions

+0

Świetna odpowiedź Mohamed. Wprowadziłbym jednak zmianę i zapisałam całkowity wynik oddzielnie od wyników meczu, abyś mógł uzyskać tylko łączne wyniki dla wszystkich użytkowników. Więc '/ TotalScores/$ uid/45' –

+0

Czy to jedyny sposób, żeby to zrobić? za pośrednictwem funkcji chmurowej? Po prostu chcę zbudować prostą statyczną stronę, więc musi istnieć inny sposób lub? – skyline33

+0

Zawsze istnieje kilka sposobów rozwiązania problemów. Ale myślę, że wygodniej jest zaimplementować swoją logikę w zapleczu (prosta funkcja węzła w twoim przypadku). Alternatywnie możesz dodawać punkty do sumy za każdym razem, gdy zapiszesz mecz w bazie danych. –

5

Przyjrzałem w twoim problemie i myślę, że mam twoje rozwiązanie, albo przynajmniej PATHWAY do twojego rozwiązania. Ok, najpierw wyjaśnię podstawowy problem, a następnie spróbuję podać ci jakiś ogólny kod (spróbuję użyć niektórych z używanych zmiennych). I odejdziemy!

zasadzie to, co widzę, jest 2 kroki ...

KROK 1 - trzeba użyć „funkcji konstruktora”, który stworzy nowe obiekty użytkowników z ich własnym imieniu (i/lub identyfikator użytkownika) oraz własnych zestaw właściwości.

Przy pomocy tego sposobu myślenia funkcja konstruktora może zawierać takie właściwości, jak "nazwa użytkownika", "punkty dopasowania 1", "punkty dopasowania 2", a następnie funkcję, w której konsola rejestruje podsumowanie każdego imienia i nazwiska. suma punktów z punktów meczowych 1 i 2.

KROK 2 - Musisz wstawić funkcję konstruktora do pętli, która przejdzie przez bazę danych, szukając specyficznych właściwości potrzebnych do wypełnienia właściwości wymaganych przez funkcję konstruktora wypluć informacje, których szukasz.

Więc ... i weźmy głęboki oddech, ponieważ to było dużo słów ... spróbujmy to zakodować. Użyję ogólnych właściwości w sposób, który moim zdaniem ułatwi wstawianie własnych nazw właściwości/zmiennych.

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.");}; 
} 

"Ta" część kodu umożliwia użycie dowolnej nazwy użytkownika, a nie tylko określonej.

OK, więc powyższy kod zajmuje się funkcją konstruktora, część problemu. Teraz nie ma znaczenia, ilu użytkowników trzeba utworzyć z unikalnymi nazwami.

Następnym krokiem jest utworzenie pewnego rodzaju funkcji pętli, która przejdzie przez bazę danych i wypełni właściwości niezbędne do utworzenia każdego użytkownika, aby uzyskać wszystkie punkty od KAŻDEGO użytkownika, a nie tylko od jednego.

Znowu użyję generic-owski nieruchomość/nazw zmiennych ...

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.");}; 
    } 
} 

To jest dużo słów, a kod jest hybrydą własności nazwy rodzajowe/zmiennych i nazw własności/zmienne używane przez ciebie, ale jestem pewien, że jestem na właściwej ścieżce.

Mam dużo pewności, że jeśli użyjesz kodu i WYJAŚNIENIA, które dostarczyłem, to po podłączeniu własnych zmiennych otrzymasz rozwiązanie, którego potrzebujesz.

Na zakończenie chcę tylko powiedzieć, że NAPRAWDĘ mam nadzieję, że to pomoże, a jeśli nie, chciałbym pomóc rozwiązać ten czy inny sposób, ponieważ potrzebuję tej praktyki. Pracuję na pracę z dziwnych godzinach i tak, gdybym nie odpowiedział od razu jestem prawdopodobnie w mojej pracy :(

Powodzenia i mam nadzieję, że pomogłem!

+0

Wygląda na to, że Mohammed pobił mnie do uderzenia i znacznie prostszym rozwiązaniem! Odwzorowuję jego odpowiedź tak, aby móc ją zrozumieć. Hej ... BRAVO Mohamed! :) –

+0

dzięki za poświęcenie czasu na napisanie tego, możesz pokazać mi przykład json? masz na myśli: https://jsonblob.com/f22313a3-4e29-11e7-ae4c-096d61fc72e0 – skyline33

+0

Hej skyline! Niestety, jestem zakłopotany, gdy mówię, że nie wiem jeszcze nic o Jsonie. Po prostu znam html, css i javascript, ale czuję się całkiem dobrze z javascript i rozpoznałem javascript w twoim problemie i zobaczyłem, jak można go rozwiązać. –

2

Sprawdź tę realizację. Nie potrzeba chmurze funkcja.

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

Chociaż jest to poprawne, nie jest optymalne, ponieważ musisz przejść na przednim końcu. Mohamed jest lepszy, ponieważ ukrywa logikę przed aplikacją (bezpieczniejszą). Plus, firebase to baza danych nosql. Lepiej więc podejść do niego z punktu widzenia nosql, aby uzyskać optymalne rozwiązanie. –

1

Jeśli klucz jest ID użytkownika, dlaczego dodać kolejną zagnieżdżonego obiektu z nazwy użytkownika? Czy można oczekiwać jednego użytkownika, aby mieć wiele nazw użytkowników? to brzmi dziwnie i dodaje złożoności, jak ty Prawdopodobnie zauważyłeś, że jeśli chcesz zachować nazwę użytkownika w Firebase, zalecane jest podanie szczegółów użytkownika gdzieś bezpośrednio pod kluczem użytkownika. Oto reprezentacja JavaScript obiektu struktury Firebase:

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

Teraz dotarcie do sumy punktów wydaje się nieco bardziej proste, czyż nie?

Aby pomóc Ci bez modyfikowania aktualnej struktury bazy danych, wystarczy, że przetworzysz w bazie danych wszystkie ustawienia userId + username + matches permutation. Oto przykładowy kod, aby osiągnąć tylko, że nie trzeba żadnych specjalnych funkcji Firebase, po prostu dobre stare JavaScript do-pętli:

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 
     } 
    } 
    } 
})