Cómo obtener un recuento de la cantidad de documentos en una colección con Cloud Firestre

En Firestre, ¿cómo puedo obtener la cantidad total de documentos en una colección?

Por ejemplo, si tengo

/people /123456 /name - 'John' /456789 /name - 'Jane' 

Quiero consultar cuántas personas tengo y obtener 2.

Podría hacer una consulta en / people y luego obtener la longitud de los resultados devueltos, pero eso parece un desperdicio, especialmente porque haré esto en conjuntos de datos más grandes.

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 en el lado del cliente. Esto funciona lo suficientemente bien para pequeños conjuntos de datos, pero obviamente no funciona si el conjunto de datos es más grande.

Opción 2: mejor esfuerzo de 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 documento único para leer para darle el recuento casi actual inmediatamente.

Si es necesario que supere 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 superar por segundo

Si usa AngulareFire2, puede hacerlo (suponiendo private afs: AngularFirestre 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, por lo que puede usar el método valueChanges() directamente.

Las agregaciones son el camino a seguir (las funciones de firebase se parecen a 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/firestre/solutions/aggregation

Otra forma (NO recomendada) que no es buena para listas grandes e implica la descarga de toda la lista: res.size como este ejemplo:

 db.collection('products').get().then(res => console.log(res.size)) 

Siguiendo a Dan Respuesta : Puede tener un contador separado en su base de datos y usar Cloud Functions para mantenerlo. ( Mejor esfuerzo de escritura )

 // Example of performing an increment when item is added module.exports.incrementIncomesCounter = collectionRef.onCreate(event => { const counterRef = event.data.ref.firestre.doc('counters/incomes') counterRef.get() .then(documentSnapshot => { const currentCount = documentSnapshot.exists ? documentSnapshot.data().count : 0 counterRef.set({ count: Number(currentCount) + 1 }) .then(() => { console.log('counter has increased!') }) }) }) 

Este código muestra el ejemplo completo de cómo hacerlo: https://gist.github.com/saintplay/3f965e0aea933a1129cc2c9a823e74d7