了解添加单个文档后将快照附加到集合的读取次数

时间:2020-10-12 11:19:19

标签: firebase google-cloud-firestore

假设在我的应用中,我已经使用快照侦听器读取了整个集合。

如果在阅读完整个收藏集后几秒钟添加了文档,是否会触发整个收藏夹阅读?还是只是新文档?

例如-2人之间的聊天应用程序:

一个集合(代表一个聊天室)包含4个文档(每个代表一条消息)已经被用户读取,因此有4次读取。如果对方发送了另一封邮件,这是否意味着刚进行了另外5次读取(4个旧文档和一个全新的文档),导致总共9次读取?还是只读取了新集合,总共读取了5次(从开始读取4次,在侦听器检测到插入到集合中的新文档之后又读取了一次)?

为清楚起见,示例中描述的所有过程(从最初的阅读开始)都需要几秒钟。

我无法在线找到解决方案或类似问题,而且无论我在其中搜索了多少内容,我都无法理解Firebase文档中是否有答案。

使用答案进行编辑:\

尝试找出确切数字后,我进行了测试,得出以下结果:

具有(例如)20个文档的集合(侦听器已附加到该文档中),您添加了另外10个文档的结果导致读取次数超过10。

我对类似聊天的实现的结论是,我建议使用Firebase实时数据库,而不要使用firestore。使用childeventListener,您可以提取和读取新消息,而无需重新读取已经预先加载的多个模型。

我要测试的编辑代码:

collectionRef.orderBy("timestamp", Query.Direction.ASCENDING).addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
                if(error!= null)
                    return;
                ArrayList<ChatMessage> justRead = new ArrayList<>();
                for(DocumentSnapshot snapshot : value){
                    ChatMessage data = snapshot.toObject(ChatMessage.class);
                    justRead.add(data);
                    Log.i(TAG, "msg: " + data.getMsg() + "\n" + "from cache:" +  snapshot.getMetadata().isFromCache());

                }
            }
        }));

日志:

 2020-10-13 08:26:50.393 9275-9275/****** I/FirebaseLobbyViewModel: msg: first msg
    from cache:true
2020-10-13 08:26:50.402 9275-9275/****** I/FirebaseLobbyViewModel: msg: second msg
    from cache:true
2020-10-13 08:27:04.853 9275-9275/****** I/FirebaseLobbyViewModel: msg: first msg
    from cache:false
2020-10-13 08:27:04.853 9275-9275/****** I/FirebaseLobbyViewModel: msg: second msg
    from cache:false
2020-10-13 08:27:04.853 9275-9275/****** I/FirebaseLobbyViewModel: msg: third msg
    from cache:false

您可以看到我以2 msg的启动时间启动了应用程序,已经从缓存中读取了该内容,但是在发送了第三条消息之后,并没有从缓存中获得所有3条消息

2 个答案:

答案 0 :(得分:1)

快照侦听器仅下载自上一个快照以来已更改的文档的文档数据。他们不会再次读取整个结果集。只要未侦听的文档仍添加到查询中,它们就会从内存中传递到快照侦听器。如果删除侦听器并再次添加它,它将导致所有匹配的文档被重新读取。

答案 1 :(得分:1)

试图找出确切的数字后,我运行了一个测试,得出以下结果:一个带有(说)20个文档的列表(一个listiner附加到该集合),再添加10个文档会导致大约20个结果+读取(肯定超过10个)。我对聊天之类的解决方案的建议是使用Firebase实时数据库而不是Firestore推荐。使用childeventListiner,您可以提取和读取新消息,而无需重新读取已经预先加载的几种模型。