当前位置: 首页 > 知识库问答 >
问题:

如何计算FireStore中一个集合下的文件数量?

潘畅
2023-03-14
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

共有1个答案

穆睿才
2023-03-14

编辑:2021年7月10日

最近,Firebase增加了一个名为分布式计数器的新扩展:

使用此扩展可向应用程序添加高度可伸缩的计数器服务。这对于计算病毒式操作或任何非常高速的操作(如视图、喜欢或共享)的应用程序是理想的。

    null
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实时数据库。

总之,对小型数据集使用第一个代码,第二个使用云函数,因为这是写时最大的努力,第三个使用我在上面向您解释的最后一个选项。

 类似资料: