我想问关于 Firestore 的问题
阅读the docs
当添加、删除或修改文档时,我会在此文档的代码中收到有关该事件的信号:
db.collection("cities").where("state", "==", "CA")
.onSnapshot((snapshot) => {
snapshot.docChanges().forEach((change) => {
if (change.type === "added") {
console.log("New city: ", change.doc.data());
}
if (change.type === "modified") {
console.log("Modified city: ", change.doc.data());
}
if (change.type === "removed") {
console.log("Removed city: ", change.doc.data());
}
});
});
当我启动这个监听器时,我是否会得到所有匹配 "state", "==", "CA"
的文档,即使它是 100.000 个?他们是一次性还是分批来?
在上述初始所有 (100.000) 之后,我是否会始终获得一 (1) 个文档,例如修改、添加或删除文档时,或者是否可能存在来自 Firestore 的批量折叠延迟,所以我会在快照中获得一对多吗?
答案 0 :(得分:1)
当您第一次运行查询时,您将获得与该查询匹配的所有内容,并带有 change.type === "added"
。然后,您将收到所做的更改,一个接一个(除非有人一次编写一批)。
管理这种情况的方法是向集合添加过滤器。例如,您可能希望按日期字段或名称字段对集合进行排序。然后将结果限制为可管理的数字和 paginate。
db.collection("cities")
.where("state", ">=", "CA")
.orderBy("state")
.limit(50)
.onSnapshot((snapshot) => {
snapshot.docChanges().forEach((change) => {
if (change.type === "added") {
console.log("New city: ", change.doc.data());
}
if (change.type === "modified") {
console.log("Modified city: ", change.doc.data());
}
if (change.type === "removed") {
console.log("Removed city: ", change.doc.data());
}
});
});
不要忘记添加 unsubscribe 以便您可以删除侦听器
答案 1 :(得分:1)
您只会获得添加/修改/删除的文档,但是文档明确指出第一次设置侦听器时它将返回所有匹配的文档文档。
<块引用>第一个查询快照包含所有现有的添加事件 与查询匹配的文档。这是因为你得到了一套 使您的查询快照与初始状态保持同步的更改 查询的状态。例如,这允许您直接 根据您在第一个查询中收到的更改填充您的 UI 快照,无需添加特殊逻辑来处理 初始状态。
所以他们一直都来。之后,它们将只是更改,即被更改的文档数量。
<块引用>初始状态可以直接来自服务器,也可以来自本地 缓存。如果本地缓存中有可用状态,则查询 快照最初将填充缓存数据,然后 当客户端赶上时更新服务器的数据 服务器的状态。
话虽如此,如果数据来自服务器而不是来自本地缓存,您可能需要为此付费。