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());
}
});
java.lang.IllegalStateException: Task is not yet complete
编辑:2021年7月10日
最近,Firebase增加了一个名为分布式计数器的新扩展:
使用此扩展可向应用程序添加高度可伸缩的计数器服务。这对于计算病毒式操作或任何非常高速的操作(如视图、喜欢或共享)的应用程序是理想的。
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());
}
}
});
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());
}
}
});
作为个人提示,不要在Cloud Firestore中存储这种计数器,因为每次增加或减少计数器都会花费一次读
或写
操作。在Firebase Realtime
数据库中托管此计数器几乎是免费的。
第二种方法是在添加或删除文档的同时更新计数器,而不是使用云函数。这样,你的计数器也将是准确的,因为它是同时更新的。但在这种情况下,最重要的是,您需要确保在添加或删除文档的任何地方都包含此逻辑。在这种情况下,您也可以免费使用Firebase实时数据库。
总之,对小型数据集使用第一个代码,第二个使用云函数,因为这是写时最大的努力,第三个使用我在上面向您解释的最后一个选项。
我有一个包含10个文档的产品根集合。每个文档都有100个文档的子集合,没有其他字段。 现在如果我阅读产品收藏的文件 将收取多少次读取费用,由于我正在获取具有10个文档的产品集合的文档,我将收取10次读取费用?或者每个文档都有100个文档的子集合,因此我将收取10*100 =1000文档读取费用?
下面是我的函数:
如果是,我该怎么做?
如果一个集合中有大量的文档,我是否可以在不加载整个集合的情况下获得文档的计数。
我想获得firestore集合中的文档总数,我正在制作一个论坛应用程序,所以我想显示每个讨论中的当前评论量。有之类的东西吗?