Możesz uzyskać liczbę dzieci za pośrednictwem
firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });
Ale uważam, że to pobiera całe poddrzewo tego węzła z serwera. W przypadku ogromnych list wydaje się, że pamięć RAM i opóźnienia są duże. Czy istnieje sposób uzyskania liczby (i / lub listy imion dzieci) bez pobierania całości?
Odpowiedzi:
Podany przez Ciebie fragment kodu faktycznie ładuje cały zestaw danych, a następnie liczy go po stronie klienta, co może być bardzo powolne w przypadku dużych ilości danych.
Firebase nie ma obecnie możliwości liczenia dzieci bez ładowania danych, ale planujemy je dodać.
Na razie jednym rozwiązaniem byłoby utrzymywanie licznika liczby dzieci i aktualizowanie go za każdym razem, gdy dodajesz nowe dziecko. Możesz użyć transakcji do liczenia przedmiotów, tak jak w tym kodzie śledzącym upvodes:
Więcej informacji można znaleźć pod adresem https://www.firebase.com/docs/transactions.html
AKTUALIZACJA: Firebase niedawno wydało Cloud Functions. Dzięki Cloud Functions nie musisz tworzyć własnego serwera. Możesz po prostu napisać funkcje JavaScript i przesłać je do Firebase. Firebase będzie odpowiedzialny za wyzwalanie funkcji po wystąpieniu zdarzenia.
Jeśli chcesz na przykład liczyć głosy za, powinieneś stworzyć strukturę podobną do tej:
A następnie napisz funkcję javascript, aby zwiększyć
upvotes_count
czas nowego zapisu doupvotes
węzła.Możesz przeczytać Dokumentację, aby dowiedzieć się, jak rozpocząć korzystanie z funkcji chmury .
Inny przykład liczenia postów jest tutaj: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Aktualizacja styczeń 2018
Dokumentacja Firebase uległa zmianie, więc zamiast tego
event
mamy terazchange
icontext
.Podany przykład zgłasza błąd, narzekając, że
event.data
jest niezdefiniowany. Ten wzór wydaje się działać lepiej:`` ''
źródło
To trochę późno w grze, ponieważ kilku innych już ładnie odpowiedziało, ale opowiem, jak mogę to zaimplementować.
Zależy to od faktu, że Firebase REST API oferuje
shallow=true
parametr.Załóżmy, że masz
post
obiekt, a każdy z nich może mieć kilkacomments
:Oczywiście nie chcesz pobierać wszystkich komentarzy, tylko liczbę komentarzy.
Zakładając, że masz klucz do wpisu, możesz wysłać
GET
prośbę dohttps://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true
.To zwróci obiekt składający się z par klucz-wartość, gdzie każdy klucz jest kluczem komentarza, a jego wartość to
true
:Rozmiar tej odpowiedzi jest znacznie mniejszy niż żądanie równoważnych danych, a teraz możesz obliczyć liczbę kluczy w odpowiedzi, aby znaleźć swoją wartość (np. CommentCount =
Object.keys(result).length
).Może to nie rozwiązać całkowicie problemu, ponieważ nadal obliczasz liczbę zwracanych kluczy i niekoniecznie możesz subskrybować wartość, gdy się zmienia, ale znacznie zmniejsza rozmiar zwracanych danych bez konieczności wprowadzania jakichkolwiek zmian w schemat.
źródło
.json
na końcu adresu URL należy dołączyć , na przykład:https://yourapp.firebaseio.com/posts/comments.json?shallow=true
Zapisuj licznik na bieżąco - i wymuszaj walidację. Zhakowałem to razem - za liczenie unikalnych głosów i zliczeń, które wciąż rosną !. Ale tym razem przetestowałem swoją sugestię! (niezależnie od błędów wycinania / wklejania!).
„Sztuczka” polega na tym, aby użyć priorytetu węzła jako liczby głosów ...
Dane to:
głosuj / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount głos / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter, priority = CountofLastVote
użytkownik może głosować tylko raz && liczba musi być o jeden wyższa niż bieżąca liczba, a wartość danych musi być taka sama jak priorytet.
count (tak naprawdę ostatni wyborca) - głos musi istnieć, a jego liczba musi być równa nowej liczbie, && newcount (priorytet) może wzrosnąć tylko o jeden.
Skrypt testowy dodający 10 głosów od różnych użytkowników (w tym przykładzie fałszywy identyfikator, jeśli użytkownik auth.uid powinien być w środowisku produkcyjnym). Odlicz do (i--) 10, aby zobaczyć, że walidacja nie powiodła się.
„Ryzyko” polega na tym, że głos został oddany, ale licznik nie został zaktualizowany (hakerstwo lub błąd skryptu). Dlatego głosy mają unikalny `` priorytet '' - skrypt powinien naprawdę zaczynać się od upewnienia się, że nie ma głosowania z priorytetem wyższym niż bieżąca liczba, jeśli tak, należy zakończyć tę transakcję przed wykonaniem własnego - spraw, aby klienci wyczyścili do ciebie :)
Licznik musi zostać zainicjowany z priorytetem przed rozpoczęciem - forge nie pozwala na to, więc potrzebny jest skrypt zastępczy (zanim walidacja będzie aktywna!).
źródło
Napisz funkcję chmury do i zaktualizuj liczbę węzłów.
Patrz: https://firebase.google.com/docs/functions/database-events
root - | | -users (ten węzeł zawiera listę wszystkich użytkowników) |
| -count | -userscount: (ten węzeł dodawany dynamicznie przez funkcję chmury z liczbą użytkowników)
źródło