【问题标题】: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())")
}
}
}