Servidor de control de Firebase para mantener contadores y agregados

Es un problema conocido que Firebase no tiene una forma fácil de contar elementos. Estoy planeando crear una aplicación que dependa en gran medida de los recuentos y otros agregados. Me temo que la creación de contadores de esta aplicación con las reglas como se sugiere aquí será increíblemente complejo y difícil de mantener.

Entonces pensé en este patrón:

Mantendré un servidor que escuchará todos los elementos ingresados ​​en la base de datos y este servidor actualizará todos los contadores y agregados. El servidor contendrá el UID de un administrador especial que solo él puede actualizar los contadores.

De esta forma, los usuarios no tendrán que descargar nodos completos para obtener un conteo, además no tendré que lidiar con los problemas que surgen del mantenimiento de contadores por parte de los clientes.

¿Este patrón tiene sentido? ¿Me estoy perdiendo de algo?

Firebase ha lanzado recientemente Cloud Functions. Como se menciona en la documentación :

Cloud Functions es un entorno alojado, privado y escalable de Node.js donde puede ejecutar código JavaScript.

Con Cloud Functions, no necesita crear su propio servidor. Simplemente puede escribir funciones de JavaScript y subirlas a Firebase. Firebase será responsable de activar funciones cada vez que ocurra un evento.

Por ejemplo, supongamos que quieres contar la cantidad de Me gusta en una publicación. Deberías tener una estructura similar a esta:

{ "Posts" : { "randomKey" : { "likes_count":5, "likes" : { "userX" : true, "userY" : true, "userZ" : true, ... } } } } 

Y su función de JavaScript se escribiría así:

 const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); // Keeps track of the length of the 'likes' child list in a separate attribute. exports.countlikes = functions.database.ref('/posts/$postid/likes').onWrite(event => { return event.data.ref.parent().child('likes_count').set(event.data.numChildren()); }); 

Este código aumenta la variable likes_count cada vez que hay una nueva escritura en el nodo likes .

Esta muestra está disponible en GitHub .