java - ¿Cómo contar el número de documentos de una colección en Firestore?
android firebase (2)
Estoy tratando de obtener el recuento de CollectionReference que existe en Cloud Firestore, he intentado hacerlo con:
FirebaseFirestore db = FirebaseFirestore.getInstance();
final CollectionReference postsCollection = db.collection("Posts");
final TaskCompletionSource<Integer> source = new TaskCompletionSource<>();
new Thread(new Runnable() {
@Override
public void run() {
int fromWhereToStart = postsCollection.get().getResult().size();
source.setResult(fromWhereToStart);
}
}).start();
Task<Integer> task = source.getTask();
task.addOnCompleteListener(new OnCompleteListener<Integer>() {
@Override
public void onComplete(@NonNull Task<Integer> task) {
Log.e("Z_fromWhereToStart", "= " + task.getResult());
}
});
Pero desafortunadamente, estoy obteniendo:
java.lang.IllegalStateException: Task is not yet complete
¿Hay otra forma de obtener el recuento de otra manera de arreglar la
IllegalStateException
?
Debido a que no hay
getDocumentCount()
método
getDocumentCount()
como lo tenemos en la base de datos Firebase Realtime, un método
getChildrenCount()
, para contar realmente el número de todos los documentos debajo de su colección de
Posts
de su Cloud Firestore, use el siguiente código:
db.collection("Posts").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
int count = 0;
for (DocumentSnapshot document : task.getResult()) {
count++;
}
Log.d("TAG", count + "");
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
o
db.collection("Posts").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
Log.d("TAG", task.getResult().size() + "");
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
Los ejemplos anteriores funcionan lo suficientemente bien para conjuntos de datos pequeños, pero no funcionan si el datasete es más grande. Pero, también hay dos formas más en las que puedes lograr lo mismo.
Una forma sería usar
Cloud Functions
para actualizar un
counter
cada vez que agregue o elimine un documento de su colección de
Posts
.
Esta tecnología funciona bien también para grandes conjuntos de datos.
Pero tenga en cuenta que, en este caso, las adiciones y eliminaciones de documentos solo pueden ocurrir a una velocidad menor o igual a 1 por segundo, como se describe en
Cloud Firestore Quotas and Limits
.
Es un documento único para leer, pero le muestra el conteo actual casi al instante.
Si necesita superar esta limitación, debe implementar
distributed counters
como se explica en la
documentación oficial de los contadores distribuidos
.
Como sugerencia personal, no almacene este tipo de contadores en Cloud Firestore, porque cada vez que aumente o disminuya el contador le costará una operación de
read
owrite
. Hospede este contador en la base de datos deFirebase Realtime
sin costo .
La segunda forma sería, en lugar de usar Cloud Functions, usar transacciones en el lado del cliente, para actualizar el contador al mismo tiempo que agrega o elimina un documento. De esta manera, su contador también será preciso, ya que se actualiza al mismo tiempo. Pero lo más importante en este caso es que deberá asegurarse de incluir esta lógica en cualquier lugar donde agregue o elimine un documento. En este caso, puede usar la base de datos Firebase Realtime como weel, sin costo alguno.
Como conclusión, use el primer código para conjuntos de datos pequeños, el segundo use Cloud Functions porque es el mejor esfuerzo de tiempo de escritura y el tercer uso es la última opción que le he explicado anteriormente.
dentro de onCompelete () verifique
if (task.isSuccessful())
antes de usar los registros.
y también puede iterar sobre el documentSnapShot como
for (DocumentSnapshot document : task.getResult()){ yourCounter++;}
e incrementar el
counter
en cada iteración para saber cuántos documentos en la colección
"Posts"
están disponibles