为了账号安全,请及时绑定邮箱和手机立即绑定

如何在FiRESTORE中计算集合下的文档数?

/ 猿问

如何在FiRESTORE中计算集合下的文档数?

收到一只叮咚 2019-07-17 18:49:42

如何在FiRESTORE中计算集合下的文档数?

我想让收藏参考在CloudFiRESTORE上存在的计数,我尝试使用:

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

是否有另一种方法来获取另一种方法的计数来修复IllegalStateException?


查看完整描述

2 回答

?
蛊毒传说

因为没有getDocumentCount()方法,就像在Firebase实时数据库中一样,getChildrenCount()方法,以实际计算Posts集合来自云修复,请使用以下代码:

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());
        }
    }});

上面的例子对于小数据集来说很好,但是如果数据集更大,它就不起作用了。但是,还有两种方法可以让你实现同样的目标。

一种方法是使用云函数更新counter每次从Posts收藏。这种技术也适用于大型数据集。但请注意,在这种情况下,documetns的添加和删除只能以小于或等于每秒1的速率进行,如云修复配额和限制..这是一个要阅读的文档,但它几乎立即显示了当前的计数。

如果您需要超过此限制,则需要实现distributed counters如在分发柜台的正式文件.

作为个人提示,不要将此类计数器存储在CloudFiRestore中,因为每次您增加或减少计数器时,都会花费read或者是write行动。把这个计数器放在Firebase Realtime数据库免费.

第二种方法不是使用云函数,而是在客户端使用事务,在添加或删除文档的同时更新计数器。这样,您的计数器也将是准确的,因为它是在同一时间更新。但是在本例中最重要的是,您需要确保在任何添加或删除文档的地方都包含这个逻辑。在这种情况下,您可以使用Firebase实时数据库作为WEL,而不需要任何费用。

最后,使用小数据集的第一种代码,第二种使用云函数,因为编写时间是最好的,第三种是我前面解释过的最后一种选择。


查看完整回答
反对 回复 2019-07-17
?
一只甜甜圈

内部onCompelete()检查if (task.isSuccessful())在使用日志之前。还可以迭代文档,如for (DocumentSnapshot document : task.getResult()){ yourCounter++;}增量counter每次迭代以知道集合中有多少文档"Posts"可得


查看完整回答
反对 回复 2019-07-17

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信