Cuplikan kode yang Anda berikan memang memuat seluruh rangkaian data dan kemudian menghitungnya di sisi klien, yang bisa sangat lambat untuk sejumlah besar data.
Firebase saat ini tidak memiliki cara untuk menghitung anak-anak tanpa memuat data, tetapi kami berencana untuk menambahkannya.
Untuk saat ini, salah satu solusinya adalah dengan mempertahankan penghitung jumlah anak dan memperbaruinya setiap kali Anda menambahkan anak baru. Anda dapat menggunakan transaksi untuk menghitung item, seperti dalam upvode pelacakan kode ini:
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;
});
Untuk info lebih lanjut, lihat https://www.firebase.com/docs/transactions.html
UPDATE:
Firebase baru-baru ini merilis Cloud Functions. Dengan Cloud Functions, Anda tidak perlu membuat Server sendiri. Anda cukup menulis fungsi JavaScript dan mengunggahnya ke Firebase. Firebase akan bertanggung jawab untuk memicu fungsi setiap kali suatu peristiwa terjadi.
Misalnya, jika Anda ingin menghitung jumlah suara, Anda harus membuat struktur yang mirip dengan ini:
{
"posts" : {
"-JRHTHaIs-jNPLXOQivY" : {
"upvotes_count":5,
"upvotes" : {
"userX" : true,
"userY" : true,
"userZ" : true,
...
}
}
}
}
Dan kemudian menulis fungsi javascript untuk meningkatkan upvotes_count
ketika ada tulis baru ke upvotes
node.
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());
});
Anda dapat membaca Dokumentasi untuk mengetahui cara Memulai dengan Fungsi Cloud .
Juga, contoh penghitungan posting lainnya ada di sini:
https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Perbarui Januari 2018
Dokumen firebase telah berubah jadi alih-alih event
sekarang kita memiliki change
dan context
.
Contoh yang diberikan melempar kesalahan yang mengeluh yang event.data
tidak terdefinisi. Pola ini tampaknya bekerja lebih baik:
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);
});
`` `