Vous pouvez obtenir le nombre d'enfants via
firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });
Mais je crois que cela récupère le sous-arbre entier de ce nœud du serveur. Pour les listes énormes, cela semble intensif en RAM et en latence. Existe-t-il un moyen d'obtenir le décompte (et / ou une liste de noms d'enfants) sans récupérer le tout?
Réponses:
L'extrait de code que vous avez donné charge en effet l'ensemble des données, puis le compte côté client, ce qui peut être très lent pour de grandes quantités de données.
Firebase n'a actuellement pas de moyen de compter les enfants sans charger de données, mais nous prévoyons de l'ajouter.
Pour l'instant, une solution serait de maintenir un compteur du nombre d'enfants et de le mettre à jour chaque fois que vous ajoutez un nouvel enfant. Vous pouvez utiliser une transaction pour compter les articles, comme dans ce code de suivi des upvodes:
Pour plus d'informations, voir https://www.firebase.com/docs/transactions.html
MISE À JOUR: Firebase a récemment publié Cloud Functions. Avec Cloud Functions, vous n'avez pas besoin de créer votre propre serveur. Vous pouvez simplement écrire des fonctions JavaScript et les télécharger sur Firebase. Firebase sera responsable du déclenchement des fonctions chaque fois qu'un événement se produit.
Si vous souhaitez compter les votes positifs par exemple, vous devez créer une structure similaire à celle-ci:
Et puis écrivez une fonction javascript pour augmenter le
upvotes_count
quand il y a une nouvelle écriture sur leupvotes
nœud.Vous pouvez lire la documentation pour savoir comment démarrer avec Cloud Functions .
En outre, un autre exemple de comptage des messages est ici: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Mise à jour janvier 2018
La documentation de Firebase a changé donc au lieu de
event
nous avons maintenantchange
etcontext
.L'exemple donné lève une erreur se plaignant qui
event.data
n'est pas définie. Ce modèle semble mieux fonctionner:''
la source
C'est un peu tard dans le jeu car plusieurs autres ont déjà répondu gentiment, mais je vais partager comment je pourrais l'implémenter.
Cela dépend du fait que l' API Firebase REST propose un
shallow=true
paramètre.Supposons que vous ayez un
post
objet et que chacun puisse avoir un certain nombre decomments
:Vous ne voulez évidemment pas récupérer tous les commentaires, juste le nombre de commentaires.
En supposant que vous ayez la clé d'un message, vous pouvez envoyer une
GET
demande àhttps://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true
.Cela renverra un objet de paires clé-valeur, où chaque clé est la clé d'un commentaire et sa valeur est
true
:La taille de cette réponse est beaucoup plus petite que la demande des données équivalentes, et vous pouvez maintenant calculer le nombre de clés dans la réponse pour trouver votre valeur (par exemple commentCount =
Object.keys(result).length
).Cela ne résoudra peut-être pas complètement votre problème, car vous calculez toujours le nombre de clés renvoyées et vous ne pouvez pas nécessairement vous abonner à la valeur à mesure qu'elle change, mais cela réduit considérablement la taille des données renvoyées sans nécessiter de modification de votre schéma.
la source
.json
à la fin de l'URL, par exemple:https://yourapp.firebaseio.com/posts/comments.json?shallow=true
Enregistrez le décompte au fur et à mesure et utilisez la validation pour l'appliquer. J'ai piraté cela ensemble - pour garder un décompte des votes uniques et des décomptes qui ne cessent de monter !. Mais cette fois, j'ai testé ma suggestion! (nonobstant les erreurs de copier / coller!).
Le `` truc '' ici est d'utiliser la priorité du nœud comme compte de vote ...
Les données sont:
vote / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount vote / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter, priority = CountofLastVote
l'utilisateur ne peut voter qu'une seule fois && le compte doit être supérieur de un au nombre actuel et la valeur des données doit être identique à la priorité.
count (dernier votant vraiment) - le vote doit exister et son compte est égal à newcount, && newcount (priorité) ne peut augmenter que de un.
Script de test pour ajouter 10 votes par différents utilisateurs (pour cet exemple, id est falsifié, devrait l'utilisateur auth.uid en production). Compte à rebours de (i--) 10 pour voir l'échec de la validation.
Le «risque» ici est qu'un vote est émis, mais le décompte n'est pas mis à jour (piratage ou échec du script). C'est pourquoi les votes ont une `` priorité '' unique - le script doit vraiment commencer par s'assurer qu'il n'y a pas de vote avec une priorité supérieure au décompte actuel, s'il y en a, il doit terminer cette transaction avant de faire la sienne - faites nettoyer vos clients pour vous :)
Le décompte doit être initialisé avec une priorité avant de commencer - forge ne vous permet pas de faire cela, donc un script stub est nécessaire (avant que la validation ne soit active!).
la source
écrire une fonction cloud et mettre à jour le nombre de nœuds.
Référer : https://firebase.google.com/docs/functions/database-events
racine-- | | -users (ce nœud contient la liste de tous les utilisateurs) |
| -count | -userscount: (ce nœud ajouté dynamiquement par la fonction cloud avec le nombre d'utilisateurs)
la source