猿问
下载APP

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

如何在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?


收到一只叮咚
浏览 133回答 2
2回答

蛊毒传说

因为没有getDocumentCount()方法,就像在Firebase实时数据库中一样,getChildrenCount()方法,以实际计算Posts集合来自云修复,请使用以下代码:db.collection("Posts").get().addOnCompleteListener(new&nbsp;OnCompleteListener<QuerySnapshot>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onComplete(@NonNull&nbsp;Task<QuerySnapshot>&nbsp;task)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(task.isSuccessful())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(DocumentSnapshot&nbsp;document&nbsp;:&nbsp;task.getResult())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("TAG",&nbsp;count&nbsp;+&nbsp;""); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(TAG,&nbsp;"Error&nbsp;getting&nbsp;documents:&nbsp;",&nbsp;task.getException()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}});或db.collection("Posts").get().addOnCompleteListener(new&nbsp;OnCompleteListener<QuerySnapshot>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onComplete(@NonNull&nbsp;Task<QuerySnapshot>&nbsp;task)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(task.isSuccessful())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("TAG",&nbsp;task.getResult().size()&nbsp;+&nbsp;""); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(TAG,&nbsp;"Error&nbsp;getting&nbsp;documents:&nbsp;",&nbsp;task.getException()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}});上面的例子对于小数据集来说很好,但是如果数据集更大,它就不起作用了。但是,还有两种方法可以让你实现同样的目标。一种方法是使用云函数更新counter每次从Posts收藏。这种技术也适用于大型数据集。但请注意,在这种情况下,documetns的添加和删除只能以小于或等于每秒1的速率进行,如云修复配额和限制..这是一个要阅读的文档,但它几乎立即显示了当前的计数。如果您需要超过此限制,则需要实现distributed counters如在分发柜台的正式文件.作为个人提示,不要将此类计数器存储在CloudFiRestore中,因为每次您增加或减少计数器时,都会花费read或者是write行动。把这个计数器放在Firebase Realtime数据库免费.第二种方法不是使用云函数,而是在客户端使用事务,在添加或删除文档的同时更新计数器。这样,您的计数器也将是准确的,因为它是在同一时间更新。但是在本例中最重要的是,您需要确保在任何添加或删除文档的地方都包含这个逻辑。在这种情况下,您可以使用Firebase实时数据库作为WEL,而不需要任何费用。最后,使用小数据集的第一种代码,第二种使用云函数,因为编写时间是最好的,第三种是我前面解释过的最后一种选择。

一只甜甜圈

内部onCompelete()检查if (task.isSuccessful())在使用日志之前。还可以迭代文档,如for (DocumentSnapshot document : task.getResult()){ yourCounter++;}增量counter每次迭代以知道集合中有多少文档"Posts"可得
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答