如何仅订阅Firebase集合更改

时间:2019-02-20 03:20:44

标签: angular firebase google-cloud-firestore angularfire2

我正在通过角度应用程序中的@angular/fire使用firebase javascript sdk。

使用angularfire Collection#stateChanges(),我想只是订阅集合的状态更改(基于描述)。即最初订阅时,不会返回任何内容。但是,我发现stateChanges()立即返回集合中的所有内容,然后继续返回状态更改。

是否可以公正订阅未来的状态更改,而不是“重放”过去的更改(直接使用firebase-js-sdk还是通过@angular/fire)?

例如,如果您已经下载了集合的当前状态的副本,那么您只需要订阅集合更新,就不想重新下载集合状态。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您可能正在寻找的是集合上的stateChanges方法。  从文档中:

  

您为什么要使用它? -以上方法返回一个按查询顺序排序的同步数组。 stateChanges()会在发生更改时发出更改,而不是同步查询顺序。这对于ngrx集成非常有效,因为您可以在化简器方法中构建自己的数据结构。

还有一个使用@angular/fire的代码示例:

this.angularFirestore
  .collection('my-collection')
  .stateChanges(['added', 'removed', updated']) // double check the state change references, these were assumed
  .pipe(...);

答案 1 :(得分:0)

目前,firebase不支持仅 订阅查询更改。订阅查询时,还必须立即下载所有相关文档(请参阅firebase-js-sdk存储库中的问题#1551)。

如上所述,您可以通过在文档中添加updatedAt属性并在updatedAt > now中查询所有文档来伪造此功能。这会使您订阅将来的更改。

这种解决方法的局限性在于,Firestore仅支持在查询的单个字段上使用不等式过滤器(>=<等),因此在{ {1}}字段可能有问题。

答案 2 :(得分:0)

以下方法是我用于类似案例的方法。 我有用户,组和组中的用户请求。

登录后,我获得了所需的数据(所有数据一目了然。)

但是对于已登录的用户,我需要预订该组请求的任何插入,删除或版本(不仅限于更新..)。

因此,我创建了一个更改请求的集合。 (groupRequestsChanged)

我已订阅

collection('groupRequestsChanged').doc(group-id-here...).valueChanged().subscribe()

这种方法在某些情况下很有用。