Anda bisa mendapatkan jumlah anak melalui
firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });
Tapi saya percaya ini mengambil seluruh sub-pohon dari simpul itu dari server. Untuk daftar besar, itu sepertinya RAM dan latensi intensif. Apakah ada cara untuk mendapatkan hitungan (dan / atau daftar nama anak) tanpa mengambil semuanya?
Jawaban:
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:
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:
Dan kemudian menulis fungsi javascript untuk meningkatkan
upvotes_count
ketika ada tulis baru keupvotes
node.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 memilikichange
dancontext
.Contoh yang diberikan melempar kesalahan yang mengeluh yang
event.data
tidak terdefinisi. Pola ini tampaknya bekerja lebih baik:`` `
sumber
Ini sedikit terlambat dalam permainan karena beberapa orang lain sudah menjawab dengan baik, tetapi saya akan membagikan bagaimana saya bisa menerapkannya.
Ini bergantung pada fakta bahwa Firebase REST API menawarkan
shallow=true
parameter.Asumsikan Anda memiliki
post
objek dan masing-masing dapat memiliki sejumlahcomments
:Anda jelas tidak ingin mengambil semua komentar, hanya jumlah komentar.
Dengan asumsi Anda memiliki kunci untuk sebuah posting, Anda dapat mengirim
GET
permintaan kehttps://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true
.Ini akan mengembalikan objek pasangan nilai kunci, di mana setiap kunci adalah kunci dari komentar dan nilainya adalah
true
:Ukuran respons ini jauh lebih kecil daripada meminta data yang setara, dan sekarang Anda dapat menghitung jumlah kunci dalam respons untuk menemukan nilai Anda (mis. CommentCount =
Object.keys(result).length
).Ini mungkin tidak sepenuhnya menyelesaikan masalah Anda, karena Anda masih menghitung jumlah kunci yang dikembalikan, dan Anda tidak dapat selalu berlangganan nilai saat itu berubah, tetapi hal itu sangat mengurangi ukuran data yang dikembalikan tanpa memerlukan perubahan apa pun pada Anda skema.
sumber
.json
ke akhir URL, misalnya:https://yourapp.firebaseio.com/posts/comments.json?shallow=true
Simpan hitungan saat Anda pergi - dan gunakan validasi untuk menegakkannya. Saya meretas ini bersama - untuk menjaga jumlah suara unik dan jumlah yang terus muncul !. Tapi kali ini saya sudah menguji saran saya! (terlepas dari kesalahan cut / paste!).
'Trik' di sini adalah menggunakan prioritas simpul sebagai penghitungan suara ...
Datanya adalah:
vote / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount vote / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter, priority = CountofLastVote
pengguna hanya dapat memberikan suara satu kali && hitung harus lebih tinggi dari jumlah saat ini && nilai data harus sama dengan prioritas.
hitung (pemilih terakhir benar-benar) - suara harus ada dan hitungnya sama dengan jumlah baru, && jumlah baru (prioritas) hanya dapat naik satu.
Script uji untuk menambahkan 10 suara oleh pengguna yang berbeda (untuk contoh ini, dipalsukan id, harus pengguna auth.uid dalam produksi). Hitung mundur dengan (i--) 10 untuk melihat validasi gagal.
'Risiko' di sini adalah pemilihan diberikan, tetapi penghitungan tidak diperbarui (haking atau kegagalan skrip). Inilah sebabnya mengapa suara memiliki 'prioritas' yang unik - skrip harus benar-benar dimulai dengan memastikan bahwa tidak ada suara dengan prioritas lebih tinggi dari jumlah saat ini, jika ada harus menyelesaikan transaksi itu sebelum melakukan sendiri - buat klien Anda untuk membersihkan untukmu :)
Hitungan perlu diinisialisasi dengan prioritas sebelum Anda mulai - menempa tidak membiarkan Anda melakukan ini, sehingga skrip rintisan diperlukan (sebelum validasi aktif!).
sumber
tulis fungsi cloud untuk dan perbarui jumlah simpul.
Rujuk: https://firebase.google.com/docs/functions/database-events
root-- | | -user (simpul ini berisi daftar semua pengguna) |
| -count | -userscount: (simpul ini ditambahkan secara dinamis oleh fungsi cloud dengan jumlah pengguna)
sumber