【问题标题】:Is it possible to only retrieve the newest document with a QuerySnapshot in Firestore?是否可以仅在 Firestore 中使用 QuerySnapshot 检索最新文档?
【发布时间】:2019-03-17 22:56:04
【问题描述】:

我有一个关于 QuerySnapshot 的问题。例如,假设我有一个聊天应用程序。为了让讨论保持更新,我使用了连接到 Firestore 的 StreamBuilder。我使用 querySnapshot 来检索集合“消息”中的所有文档,并且每次添加消息时,都会使用新消息和所有以前的文档触发新的查询快照。所以这是我的问题,如果我的集合“消息”包含 10 个文档,那么我第一次必须获取所有文档,所以我阅读了 10 个文档。接下来我添加一个消息,我的集合中现在有 11 个文档,即使我只需要新文档,querySnapshot 也会返回这 11 个文档。那么最后,它会算作 11 个文档已读(10 + 新文档)还是 21 (10 +11) ?如果是最新的,有没有办法只获取新文档而不是所有文档?

提前致谢。

【问题讨论】:

标签: firebase flutter google-cloud-firestore snapshot


【解决方案1】:

这取决于您是否设置了监听器 .addSnapshotListener 或者您是否刚刚使用了 .getdocument。如果您设置了侦听器,它将仅从 Firestore 读取新的或更改的文档,然后将其与本地缓存的数据合并。然后它将再次向您的应用程序显示完整的 11 个文档。 10个来自本地缓存,1个加载新的。您确实可以选择仅获取更改,请参见下文。如果您没有设置监听器,您可以将 .getdocument 更改为 .addSnapshotListener,其余代码应该相同。但不要忘记在不再需要侦听器时将其分离。

db.collection("cities").whereField("state", isEqualTo: "CA")
.addSnapshotListener { querySnapshot, error in
    guard let snapshot = querySnapshot else {
        print("Error fetching snapshots: \(error!)")
        return
    }
    snapshot.documentChanges.forEach { diff in
        if (diff.type == .added) {
            print("New city: \(diff.document.data())")
        }
        if (diff.type == .modified) {
            print("Modified city: \(diff.document.data())")
        }
        if (diff.type == .removed) {
            print("Removed city: \(diff.document.data())")
        }
    }
}

【讨论】:

    【解决方案2】:

    只要一个侦听器附加到一个查询,只要文档没有改变,就不会从服务器重新读取文档。每次更改时,侦听器都会传递整个集合,但如果它们没有更改,它们将从内存中传递。您只能通过每次回调获得更改,您甚至可以每次都check to see exactly what changed

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2019-01-08
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 2019-12-11
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多