首页 > 解决方案 > Firebase Firestore 文档计数

问题描述

        db.collection("chatrooms")
                .document(group_name)
                .collection("chats")
                .document()
                .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {

                if(task.isSuccessful()){
                    int size = task.getResult().getData().size();
                }
            }
        });

这不适用于实现“com.google.firebase:firebase-firestore:21.0.0”。任何解决方法都将受到高度赞赏。

在 Firebase 数据库上,有 getChildrenCount 方法,在 Firestore 上我找不到任何可以让我计算文档的方法。

标签: androidfirebasegoogle-cloud-firestore

解决方案


问题是您正在调用document()集合:

    db.collection("chatrooms")
            .document(group_name)
            .collection("chats")
            .document()

正如文档CollectionReference.document()所说:

返回DocumentReference 指向具有此集合中自动生成的 ID 的新文档的指针。

因此,您正在加载单个文档,这解释了为什么您无法获得集合中所有文档的计数。


您要做的是加载集合中的所有文档。为此,您只需document()从查询中删除调用,然后获取一个QuerySnapshot对象作为结果。查询快照有一个size方法可以显示文档的数量。

所以像:

db.collection("chatrooms")
        .document(group_name)
        .collection("chats")
        .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {

        if(task.isSuccessful()){
            int size = task.getResult().size();
        }
    }
});

虽然此代码在技术上有效,但您会将集合中的所有文档加载到 Android 应用程序中。当您刚开始时,这不是问题,但是当您添加更多文档时,它将加载越来越多的数据,如果您只需要计数,这将是非常浪费的。

出于这个原因,大多数应用程序本身也将此类计数器存储到数据库中。有关如何执行此操作的示例,请参阅有关分布式计数器的 Firestore 文档。


推荐阅读