【问题标题】:Does Firestore collection query get updates to all objects in the query?Firestore 集合查询是否会更新查询中的所有对象?
【发布时间】:2021-09-12 06:04:51
【问题描述】:

我试图澄清 Firestore 查询快照更新在文档更改时的语义。 "Listen to multiple documents in a collection" doc 说:

每次查询结果更改(即添加、删除或修改文档时)时,快照处理程序都会收到一个新的查询快照。

我的问题是,如果更新了快照中已经存在的文档,它会总是触发新的查询快照吗?即使对文档的更改与原始查询无关?这是在某处记录的吗? (具体来说,“查询结果变化”的定义是什么?)

考虑一个集合中包含多个现有文档的案例。首先查询所有文档,例如:

db.collection("cities").onSnapshot(snapshot => { ... })

现在,如果在集合中创建了一个新文档,或者删除了一个文档,onSnapshot 回调将被这些更改重新调用,因为“查询结果”不同。

但是,如果在调用初始 onSnapshot 回调之后修改了该示例集合中的文档,会发生什么情况? (例如,将新属性添加到“城市”文档之一。)是否总是调用onSnapshot 回调来报告此修改的文档?这算作更改“查询结果”吗?返回的文档集并没有什么不同,所以看起来这种变化可能不会在集合查询中报告?

事实上,我在我的应用程序中看到了一些奇怪的行为,我正在尝试仔细检查 onSnapshot 集合更新的语义。相比之下,the documentation 用于单文档 onSnapshot 语义更清楚地报告所有内容更改:

使用您提供的回调的初始调用会立即使用单个文档的当前内容创建文档快照。然后,每次内容更改时,另一个调用会更新文档快照。

但我无法为集合快照文档找到类似的清晰度。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    我的问题是快照中已经存在的文档是否是 更新了,它总是会触发一个新的查询快照吗?即使 对文档的更改与原来的查询无关?

    分三种情况:

    1. 对文档的更新不会改变查询返回文档这一事实。在这种情况下,快照处理程序将收到一个新的查询快照,其中将包含更新的文档。因此,即使“返回的文档集没有不同”,快照处理程序也会收到一个新的查询快照。

    示例:您的查询是db.collection("cities").where("state", "==", "CA").onSnapshot(snapshot => { ... }),例如您只需更改城市名称,或添加新属性。

    1. 对文档的更新会将文档从查询结果中删除。在这种情况下,快照处理程序将收到没有更新文档的新查询快照。

    示例:您的查询是db.collection("cities").where("state", "==", "CA").onSnapshot(snapshot => { ... }),您将状态更改为不同于CA 的值。

    1. 对文档的更新将文档包含在查询结果中。在这种情况下,快照处理程序将收到一个新的查询快照,其中包含一个新文档,即更新后的文档。

    示例:您的查询是db.collection("cities").where("state", "==", "CA").onSnapshot(snapshot => { ... }),您将状态值更改为CA


    查看文档摘录时:

    快照处理程序将收到一个新的查询快照,每次 查询结果发生变化(即,当文档被添加、删除或 修改)。

    上面的案例 1 对应“修改”,案例 2 对应“移除”,案例 3 对应“添加”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-09
      • 2020-04-14
      • 1970-01-01
      • 2019-09-02
      • 2019-10-02
      • 1970-01-01
      • 2021-09-17
      • 2019-07-25
      相关资源
      最近更新 更多