Firestore - 听特定的字段变化?

Posted

技术标签:

【中文标题】Firestore - 听特定的字段变化?【英文标题】:Firestore - Listen to specific field change? 【发布时间】:2018-05-31 07:51:56 【问题描述】:

如何使用 firestore js sdk 监听特定字段的变化?

在文档中,他们似乎只展示了如何监听整个文档,如果任何“SF”字段发生变化,都会触发回调。

db.collection("cities").doc("SF")
.onSnapshot(function(doc) 
    console.log("Current data: ", doc && doc.data());
);

【问题讨论】:

【参考方案1】:

你不能。 Firestore 中的所有操作都针对整个文档。

Cloud Functions Firestore triggers 也是如此(您只能收到以某种方式更改的整个文档)。

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

【讨论】:

与 firebase 实时数据库解决方案相比,这不是一个很大的缺点吗? 是的,这是已知的行为差异,并已在各种论坛中讨论过。如果您只想在数据库中找到一个现有的键并监听更改,那么在 RTDB 中这会容易得多。事实上,还有许多其他已知的优势(目前),记录在本博客的末尾:firebase.googleblog.com/2017/10/… 有谁知道他们是否有计划将其作为一项功能?尤其是 Cloud functions.firestore.document().field('myField/subFieldEtc').onUpdate()? @Jim 是的,如果这是您关心的问题,您应该将可以快速更改的字段拆分为不同的文档,这样您就不必支付那些不这样做的成本t. @cjcurrie 仅适用于听众,更改的文档被推送,整个文档随之而来。先前从查询中获得的未更改文档来自内存缓存。这里面没有字段粒度。【参考方案2】:

如上所述,整个文档将在您的函数中接收。但是,我创建了一个 filter function,我将其命名为 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');

    ),
  );

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

【讨论】:

这是一个不错的功能。如果您在我认为的答案中进一步解释它可能会对某些人有所帮助。 你把它翻译成javascript了吗? @AlitonOliveira 您可以使用typescriptlang.org/play进行转换【参考方案3】:

收听文档,然后在您感兴趣的字段上设置条件:

firebase.firestore().collection('Dictionaries').doc('Spanish').collection('Words').doc(word).collection('Pronunciations').doc('Castilian-female-IBM').onSnapshot(function(snapshot) 
                      if (snapshot.data().audioFiles)  // eliminates an error message
                        if (snapshot.data().audioFiles.length === 2) 
                          audioFilesReady++;
                          if (audioFilesReady === 3) 
                            $scope.showNextWord();
                          
                        
                      
                    , function(error) 
                      console.error(error);
                    );

我正在收听语音文档 (Castilian-female-IBM),其中包含 webmmp3 格式的音频文件数组。当这两个音频文件异步返回时,snapshot.data().audioFiles.length === 2。这增加了一个条件。当又有两个声音(Castilian-male-IBMLatin_American-female-IBM)返回时,audioFilesReady === 3 和下一个函数 $scope.showNextWord() 将触发。

【讨论】:

如何使用 Cloud Firestore 中的云功能收听整个集合的特定字段。【参考方案4】:

开箱即用我所做的就是使用 before 和 after 方法观察前后

const clientDataBefore = change.before.data();
console.log("Info database before ", clientDataBefore);

const clientDataAfter = change.after.data();
console.log("Info database after ", clientDataAfter );

例如,现在您应该比较特定字段的更改并执行一些操作或只是返回它。

更多关于 before.data() 和 after.data() here

【讨论】:

firebase.google.com/docs/functions/firestore-events 这是“谷歌云功能 - Cloud Firestore 触发器”的文档。这与这个主题完全不同 - 使用 Firestore onSnapshot 和 javascript。

以上是关于Firestore - 听特定的字段变化?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift (Firestore) 访问特定文档字段

Firestore - 从文档中获取特定字段

Firestore 不合并特定的地图字段

获取具有等于flutter中特定字符串的字段的Firestore文档

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段

Firebase - 使用 Cloud Functions 定位特定的 Firestore 文档字段