Solución:
Actualmente tienes 3 opciones:
Opción 1: lado del cliente
Este es básicamente el enfoque que mencionaste. Seleccione todo de la colección y cuente con el lado del cliente. Esto funciona lo suficientemente bien para conjuntos de datos pequeños, pero obviamente no funciona si el conjunto de datos es más grande.
Opción 2: mejor esfuerzo en tiempo de escritura
Con este enfoque, puede usar Cloud Functions para actualizar un contador para cada adición y eliminación de la colección.
Esto funciona bien para cualquier tamaño de conjunto de datos, siempre que las adiciones / eliminaciones solo ocurran a una velocidad menor o igual a 1 por segundo. Esto le da un solo documento para leer para darle la casi actual contar inmediatamente.
Si necesita exceder 1 por segundo, debe implementar contadores distribuidos según nuestra documentación.
Opción 3: tiempo de escritura exacto
En lugar de usar Cloud Functions, en su cliente puede actualizar el contador al mismo tiempo que agrega o elimina un documento. Esto significa que el contador también estará actualizado, pero deberá asegurarse de incluir esta lógica en cualquier lugar donde agregue o elimine documentos.
Al igual que la opción 2, deberá implementar contadores distribuidos si desea exceder por segundo
Las agregaciones son el camino a seguir (las funciones de firebase parecen la forma recomendada de actualizar estas agregaciones, ya que el lado del cliente expone información al usuario que quizás no desee que se exponga) https://firebase.google.com/docs/firestore/solutions/aggregation
Otra forma (NO recomendada) que no es buena para listas grandes e implica descargar la lista completa: res.size como este ejemplo:
db.collection("logs")
.get()
.then((res) => console.log(res.size));
Si usa AngulareFire2, puede hacerlo (asumiendo private afs: AngularFirestore
se inyecta en su constructor):
this.afs.collection(myCollection).valueChanges().subscribe( values => console.log(values.length));
Aquí, values
es una matriz de todos los elementos en myCollection
. No necesita metadatos para poder usar valueChanges()
método directamente.