L'extrait de code que vous avez donné charge effectivement l'ensemble des données et les compte ensuite côté client, ce qui peut être très lent pour de grandes quantités de données.
Firebase ne dispose pas actuellement d'un moyen de compter les enfants sans charger les 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 pourriez utiliser une transaction pour compter les éléments, comme dans ce code de suivi des upvodes :
var upvotesRef = new Firebase('https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes');
upvotesRef.transaction(function (current_value) {
return (current_value || 0) + 1;
});
Pour plus d'informations, voir https://www.firebase.com/docs/transactions.html
UPDATE : 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 se chargera de déclencher les fonctions dès qu'un événement se produit.
Si vous voulez compter les upvotes par exemple, vous devez créer une structure similaire à celle-ci :
{
"posts" : {
"-JRHTHaIs-jNPLXOQivY" : {
"upvotes_count":5,
"upvotes" : {
"userX" : true,
"userY" : true,
"userZ" : true,
...
}
}
}
}
Et ensuite écrire une fonction javascript pour augmenter le upvotes_count
lorsqu'il y a une nouvelle écriture dans le upvotes
nœud.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.countlikes = functions.database.ref('/posts/$postid/upvotes').onWrite(event => {
return event.data.ref.parent.child('upvotes_count').set(event.data.numChildren());
});
Vous pouvez lire le Documentation de savoir comment Commencez avec les fonctions en nuage .
Par ailleurs, un autre exemple de comptage des messages est présenté ici : https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Mise à jour de janvier 2018
Le site docs firebase ont changé, de sorte qu'au lieu de event
nous avons maintenant change
et context
.
Dans l'exemple donné, une erreur est générée, car elle indique que event.data
est indéfinie. Ce modèle semble mieux fonctionner :
exports.countPrescriptions = functions.database.ref(`/prescriptions`).onWrite((change, context) => {
const data = change.after.val();
const count = Object.keys(data).length;
return change.after.ref.child('_count').set(count);
});
```