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

Firebase 了解添加单个文档后将快照附加到集合的读取次数,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,假设在我的应用程序中,我已经用快照侦听器读取了整个集合 如果在读取整个集合几秒钟后添加文档,是否会触发整个集合的读取?还是仅仅是新文件 例如-两人之间的聊天应用程序: 一个集合(表示聊天室)包含4个文档(每个文档表示一条消息),用户已经读取了这些文档,因此读取了4次。如果对方发送另一条消息,这是否意味着又进行了5次读取(4次旧文档,一次全新文档),导致总共9次读取?或者只读取新集合,导致总共读取5次(从开始读取4次,在侦听器检测到新文档插入到集合后读取另一次) 只是为了清除示例中描述的所有过程(

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

如果在读取整个集合几秒钟后添加文档,是否会触发整个集合的读取?还是仅仅是新文件

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

一个集合(表示聊天室)包含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());

                }
            }
        }));

您可以看到,我已使用集合中的2条消息启动应用程序,该消息已从缓存中读取并访问,但在发送第三条消息后,所有3条消息均未从缓存中获取。快照侦听器仅下载自上次快照以来已更改的文档的文档数据。他们不会再次重新读取整个结果集。只要侦听器仍然添加到查询中,未加密的文档就会从内存传递到快照侦听器。如果删除侦听器并再次添加它,将导致再次读取所有匹配的文档。

在尝试计算出确切的数字后,我运行了一个测试,结果如下:一个包含(比如)20个文档(附加了listiner)的集合,再添加10个文档将导致大约20多次读取(肯定超过10)。对于类似聊天的实现,我的结论是,我建议使用Firebase实时数据库,而不是firestore。使用childeventListiner,您可以提取和读取新消息,而无需重新读取您已预加载的多个模型。

问题是,我们不是在讨论文档更新,而是在讨论一个li添加全新文档后发生的事件。在这种情况下,我的测试显示读取计数等于新文档的数量,但大于(当时是两倍),无论如何,非常感谢您的回复。我说的正是您所说的。只有查询结果集中的新文档和更新文档才会导致读取计费。感谢您的快速响应,我可能误解了您的意思。我已记录了每个快照元数据,以查看其是否来自缓存,大多数情况下,所有快照都是从缓存返回的urn为false。这并不意味着它们来自服务器?因此进行了读取操作?此外,我在聊天时将应用程序打开了一个小时,确保firebase dashboard中的读取计数是稳定的,在10条消息之后,读取计数增加了20。没有看到您的代码、日志输出、数据库内容和特定的cha请阅读:我真正想了解的是,如果一个文档不是通过缓存获取的,那就意味着它是从服务器获取的,因此可以算作读取?
 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