Puede hacer que el niño cuente a través de
firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });
Pero creo que esto obtiene todo el subárbol de ese nodo del servidor. Para listas enormes, parece que la RAM y la latencia son intensivas. ¿Hay alguna manera de obtener el recuento (y / o una lista de nombres de niños) sin obtener todo?
Respuestas:
El fragmento de código que proporcionó realmente carga todo el conjunto de datos y luego lo cuenta del lado del cliente, lo que puede ser muy lento para grandes cantidades de datos.
Firebase actualmente no tiene una forma de contar niños sin cargar datos, pero planeamos agregarlos.
Por ahora, una solución sería mantener un contador del número de hijos y actualizarlo cada vez que agregue un hijo nuevo. Puede usar una transacción para contar artículos, como en este código de seguimiento de las mejoras:
Para obtener más información, consulte https://www.firebase.com/docs/transactions.html
ACTUALIZACIÓN: Firebase lanzó recientemente Cloud Functions. Con Cloud Functions, no necesita crear su propio servidor. Simplemente puede escribir funciones de JavaScript y subirlo a Firebase. Firebase será responsable de activar las funciones cada vez que ocurra un evento.
Si desea contar votos a favor, por ejemplo, debe crear una estructura similar a esta:
Y luego escriba una función de JavaScript para aumentar
upvotes_count
cuando hay una nueva escritura en elupvotes
nodo.Puede leer la Documentación para saber cómo comenzar con las funciones en la nube .
Además, otro ejemplo de conteo de publicaciones está aquí: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Actualización enero 2018
Los documentos de Firebase han cambiado, así que en lugar de
event
ahora tenemoschange
ycontext
.El ejemplo dado arroja un error quejándose que
event.data
no está definido. Este patrón parece funcionar mejor:`` `
fuente
Esto es un poco tarde en el juego ya que muchos otros ya han respondido bien, pero compartiré cómo podría implementarlo.
Esto depende del hecho de que Firebase REST API ofrece un
shallow=true
parámetro.Suponga que tiene un
post
objeto y cada uno puede tener varioscomments
:Obviamente, no desea obtener todos los comentarios, solo la cantidad de comentarios.
Suponiendo que tiene la clave para una publicación, puede enviar una
GET
solicitud ahttps://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true
.Esto devolverá un objeto de pares clave-valor, donde cada clave es la clave de un comentario y su valor es
true
:El tamaño de esta respuesta es mucho más pequeño que solicitar los datos equivalentes, y ahora puede calcular el número de claves en la respuesta para encontrar su valor (por ejemplo, commentCount =
Object.keys(result).length
).Es posible que esto no resuelva completamente su problema, ya que todavía está calculando el número de claves devueltas, y no necesariamente puede suscribirse al valor a medida que cambia, pero reduce en gran medida el tamaño de los datos devueltos sin requerir ningún cambio en su esquema.
fuente
.json
al final de la URL, por ejemplo:https://yourapp.firebaseio.com/posts/comments.json?shallow=true
Guarde el recuento a medida que avanza y use la validación para aplicarlo. Pirateé esto juntos, ¡por mantener un recuento de votos únicos y recuentos que siguen surgiendo! ¡Pero esta vez he probado mi sugerencia! (¡a pesar de los errores de cortar / pegar!).
El 'truco' aquí es usar la prioridad de nodo como el recuento de votos ...
Los datos son:
vote / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount vote / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter, priority = CountofLastVote
el usuario solo puede votar una vez && count debe ser uno más alto que el conteo actual && el valor de los datos debe ser igual a la prioridad.
recuento (último votante realmente): el voto debe existir y su recuento es igual al recuento nuevo, y & recuento nuevo (prioridad) solo puede aumentar en uno.
Pruebe la secuencia de comandos para agregar 10 votos de diferentes usuarios (para este ejemplo, la identificación es falsa, debería usar auth.uid en producción). Cuenta atrás para (i--) 10 para ver la validación falla.
El 'riesgo' aquí es que se emite un voto, pero el recuento no se actualiza (piratería o falla del script). Esta es la razón por la cual los votos tienen una 'prioridad' única: el guión realmente debería comenzar asegurándose de que no haya un voto con prioridad más alta que el conteo actual, si es que debe completar esa transacción antes de hacer la suya, haga que sus clientes limpien para ti :)
El recuento debe inicializarse con una prioridad antes de comenzar: forge no le permite hacer esto, por lo que se necesita un script de código auxiliar (¡antes de que la validación esté activa!).
fuente
escribir una función en la nube y actualizar el recuento de nodos.
Consulte: https://firebase.google.com/docs/functions/database-events
raíz-- | | -users (este nodo contiene la lista de todos los usuarios) |
| -count | -userscount: (este nodo agregado dinámicamente por la función de la nube con el recuento de usuarios)
fuente