【问题标题】:Listen only to additions to a cloud firestore collection?只收听云 Firestore 集合的添加内容?
【发布时间】:2018-08-04 12:44:18
【问题描述】:

我注意到,当我尝试在 firestore 中的集合上使用实时侦听器时,每次将新文档添加到集合中时,都会重新运行逻辑,并且我将下载集合中已有的所有内容

现在:

firebase.firestore().collection("Tweets").onSnapshot(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
        console.log("snapshot added ", doc)
      });
    });

有没有办法只跟踪收藏的添加?我想我可以在设备端进行,但不需要传输我已经查询过的所有其他数据..

该日志的输出将打印出集合中的每一条“推文”,无论是否仅添加一条

前: 初始查询

-推特 1

-推特2

-推特3

新推文,推文 4 已添加

输出:

推文 1

推文 2

推文 3

推特 4

如果有道理

【问题讨论】:

  • 我们需要更多信息。这是什么.DataRef?收藏参考?一个问题?请具体。另外,您正在使用的数据库的内容是什么?这些特定内容的日志输出是什么?
  • 抱歉,我刚刚编辑了

标签: javascript firebase google-cloud-firestore


【解决方案1】:

当您在集合上使用onSnapshot() 时,您实际上并没有在每次调用时下载整个集合。文档被缓存,当集合再次发生变化时将被重用。

对于导致调用回调的每个更改,您可以通过检查快照中的更改来找出自第一次调用以来哪些文档是新的。如何做到这一点的一个例子是in the documentation。有了查询快照,您可以使用此逻辑来确定哪些文档是新文档:

snapshot.docChanges.forEach(function(change) {
    if (change.type === "added") {
        // change.doc here is new a new document
    }
});

【讨论】:

  • 有没有办法只听一次合集?代替 onSnapshot 的东西?
  • 是的,有 get() 。
  • “第一个查询快照包含所有与查询匹配的现有文档的添加事件。”,如何忽略第一个快照,只监听实际添加的文档?
  • @BlackCoffee 你不能。相反,您应该弄清楚如何只查询您想要的文档。通常这涉及添加一个可以用作过滤器的字段。要么这样,要么你必须根据你定义的标准提出你自己的一套关于什么是“新”的假设。
  • 我想出了一种忽略第一个快照的方法,一旦添加了一个新文档,回调函数就会收到另一个完整的文档补丁(不仅仅是添加的那个),并且它们都是类型再次“添加”!
【解决方案2】:

似乎onSnapshot 仅用于监听整个文档,这意味着它将返回您正在监听的文档中的所有字段。因此,您不能只检索更改的字段。 但是你可以根据不同类型的变化做不同的事情:

xxxx.onSnapshot(function(querySnapshot){
     querySnapshot.docChanges.forEach(function(change){
                    if(change.type=="added"){//first time it will be triggered

                    }else if(change.type == "modified"){//modified

                    }else if(change.type == "removed"){//removed


                    }
    })
})

希望对你有帮助

【讨论】:

  • 问题指定监听一个集合,但是这个答案指定监听一个文档
【解决方案3】:

文档被缓存,因此它们没有完全下载。但是如果完整的数据大于缓存大小,它可能会被重新下载。最好的策略是启用缓存存储到磁盘,然后使用 limitToLast(1)。

firebase.firestore().collection("Tweets")
.orderBy("key1")
.limitToLast(1)
.onSnapshot(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
        console.log("snapshot added ", doc)
      });
    });

在这个 key1 中可能是推文 ID。

这将利用自动单一属性索引,并且只会获取最后一条记录。如果启用了持久性,则此提取将从缓存中进行。

上面的多个答案都谈到了如何判断这些数据是新的还是陈旧的。

【讨论】:

    【解决方案4】:

    您可以获取导致此回调的新文档

    for change in changes:
        if change.type.name == 'ADDED':
            print(f'New document: {change.document.id}')
    

    【讨论】:

      猜你喜欢
      • 2019-09-07
      • 2019-09-14
      • 1970-01-01
      • 2018-07-14
      • 2022-01-19
      • 2023-04-08
      • 1970-01-01
      • 2021-06-04
      • 2019-06-04
      相关资源
      最近更新 更多