O snippet de código que você forneceu realmente carrega todo o conjunto de dados e o conta no lado do cliente, o que pode ser muito lento para grandes quantidades de dados.
No momento, o Firebase não tem como contar crianças sem carregar dados, mas planejamos adicioná-los.
Por enquanto, uma solução seria manter um contador do número de filhos e atualizá-lo toda vez que você adicionar um novo filho. Você pode usar uma transação para contar itens, como neste código que rastreia 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;
});
Para mais informações, consulte https://www.firebase.com/docs/transactions.html
ATUALIZAÇÃO: O
Firebase lançou recentemente o Cloud Functions. Com o Cloud Functions, você não precisa criar seu próprio servidor. Você pode simplesmente escrever funções JavaScript e enviá-lo para o Firebase. O Firebase será responsável por acionar funções sempre que ocorrer um evento.
Se você quiser contar votos positivos, por exemplo, crie uma estrutura semelhante a esta:
{
"posts" : {
"-JRHTHaIs-jNPLXOQivY" : {
"upvotes_count":5,
"upvotes" : {
"userX" : true,
"userY" : true,
"userZ" : true,
...
}
}
}
}
E, em seguida, escreva uma função javascript para aumentar upvotes_count
quando houver uma nova gravação no upvotes
nó.
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());
});
Você pode ler a documentação para saber como iniciar as funções da nuvem .
Além disso, outro exemplo de contagem de postagens está aqui:
https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Atualização janeiro 2018
Os documentos da base de firmas foram alterados. Em vez de event
agora, temos change
e context
.
O exemplo dado gera um erro de reclamação event.data
indefinido. Esse padrão parece funcionar melhor:
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);
});
`` ``