Firestore - 收听特定的字段更改?

htt*_*ete 20 javascript firebase google-cloud-firestore

如何使用firestore js sdk监听特定的字段更改?

在文档中,它们似乎只显示如何监听整个文档,如果任何"SF"字段发生更改,它将触发回调.

db.collection("cities").doc("SF")
.onSnapshot(function(doc) {
    console.log("Current data: ", doc && doc.data());
});
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 22

你不能.Firestore中的所有操作都在整个文档中.

云功能Firestore触发器也是如此(您只能接收以某种方式更改的整个文档).

如果需要缩小某些数据的范围以从文档中检索,请将其放在子集合中的文档中,并单独查询该文档.

  • 与firebase实时数据库解决方案相比,这不是一个很大的缺点吗? (6认同)
  • @Jim是的,如果这是您关心的问题,您应该将可以快速更改的字段拆分为不同的文档,这样您就不必支付不更改的字段的成本。 (4认同)
  • 是的,这是已知的行为差异,并且已在各种论坛中进行了讨论。如果您要做的只是在数据库中找到一个现有的密钥,然后侦听更改,那么在RTDB中,这要容易得多。实际上,(当前)还有很多其他已知优势,已在此博客结尾处进行了记录:https://firebase.googleblog.com/2017/10/cloud-firestore-for-rtdb-developers.html (3认同)
  • 有谁知道他们是否有计划将此作为一项功能?特别是使用 Cloud functions.firestore.document().field('myField/subFieldEtc').onUpdate()? (2认同)
  • @cjcurrie 仅适用于听众,更改的*文档*被推送,并且整个文档随之而来。先前从查询中获取的未更改文档来自内存缓存。这里没有字段粒度。 (2认同)

Chr*_*ian 8

正如 Doug 上面提到的,整个文档将在您的函数中接收。但是,我创建了一个过滤器函数,我将其命名为field,只是为了在我不感兴趣的字段中发生更改时忽略文档更改。

您可以field在代码中复制和使用上面链接的函数。例子:

export const yourCloudFunction = functions.firestore
.document('/your-path')
  .onUpdate(
    field('foo', 'REMOVED', (change, context) => {

      console.log('Will get here only if foo was removed');

    }),
  );
Run Code Online (Sandbox Code Playgroud)

重要提示:field如果其他字段发生更改,该函数不会避免执行您的函数,当更改不是您想要的时,它只会忽略。如果您的文档太大,您可能应该考虑 Doug 的建议。