Firestore 收集侦听器大量读取

Posted

技术标签:

【中文标题】Firestore 收集侦听器大量读取【英文标题】:Firestore collection listeners enormous number of reads 【发布时间】:2019-07-20 03:26:02 【问题描述】:

我正在我的一个应用中实现 Firestore 数据存储。

我有一个监听器,它跟踪“日志”集合中的更新,如下所示:

db.collection("logs").addSnapshotListener( (snapshot, error) in
    guard let s = snapshot else return
    if s.metadata.isFromCache 
        print("LOG_C \(s.documentChanges.count)")
            return
    
    print("LOG \(s.documentChanges.count)")
    // other code
)

在测试期间,我一直在将文档上传到此集合,然后通过 Firebase 控制台将它们全部删除。所以,现在,我的测试用户不存在该集合。当我第一次启动应用程序时,我确实看到这个集合是空的 - 侦听器报告了正确的结果。

但是,这样做会消耗大约 1000 次读取。几乎感觉它正在为我的测试用户下载这个集合的所有历史记录(例如,插入了 500 个文档,删除了 500 个文档)。但是,即使是这样,它也不会向我报告 - 我在控制台中只收到一条“LOG 0”消息。

这是收集监听器的工作方式吗?我确实知道侦听器会下载初始状态,但我认为这将是当前快照,在这种情况下,它将消耗 1 次读取以确定最初没有任何内容可返回。

欢迎任何解释/想法/建议。

我非常想通过查看详细的 Firestore 读取日志来调试它。但是,我在控制台中找不到这样的选项:(

【问题讨论】:

请记住,如果您正在查看正在更改的集合,则打开的 Firebase 控制台也可能会导致实时读取。 @DougStevenson 你是对的 - 我重复了我用来在控​​制台中获取测试用户数据的过程,读取次数增加了 1000... @DougStevenson 你想发表你的评论作为答案吗? 【参考方案1】:

在这种情况下,听起来好像 OP 在执行数据库操作时让 Firestore 控制台处于打开状态。由于 Firestore 控制台本身会反映实时更新,因此随着当前所选集合的变化,它会随着时间的推移而产生读取。

【讨论】:

这是正确的。更具体地说,在控制台中定位我的用户时,我使用了“电子邮件 >= MY_EMAIL_BEFORE_@_CHARACTER”的查询。正是这个查询产生了超过 1000 次读取 :)

以上是关于Firestore 收集侦听器大量读取的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取 null 的属性“Symbol(dartx._get)”(在 Flutter 中添加 Firestore 侦听器时)

创建侦听器时调用 Firestore“ListenerRegistration”,应该是?

如何删除 SnapShot 侦听器(Firestore - Swift)

为啥添加单个文档时,Firestore 侦听器会返回 .add 两次?

Firestore 查询侦听器可以“侦听”云功能吗?

是否应该避免同时添加多个 Firestore 快照侦听器?