【问题标题】:Firestore - Listen to specific field change?Firestore - 听特定的字段变化?
【发布时间】: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());
});

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 2021-12-22
    • 1970-01-01
    • 2020-03-15
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多