Firestore - Listen to specific field change?

前端 未结 4 1897
星月不相逢
星月不相逢 2020-11-29 09:43

How can I listen to a specific field change with firestore js sdk ?

In the documentation, they only seem to show how to listen for the whole document, if any of the

相关标签:
4条回答
  • 2020-11-29 10:26

    You can't. All operations in Firestore are on an entire document.

    This is also true for Cloud Functions Firestore triggers (you can only receive an entire document that's changed in some way).

    If you need to narrow the scope of some data to retrieve from a document, place that in a document within a subcollection, and query for that document individually.

    0 讨论(0)
  • 2020-11-29 10:28

    As Doug mentioned above, the entire document will be received in your function. However, I have created a filter function, which I named field, just to ignore document changes when those happened in fields that I am not interested in.

    You can copy and use the function field linked above in your code. Example:

    export const yourCloudFunction = functions.firestore
    .document('/your-path')
      .onUpdate(
        field('foo', 'REMOVED', (change, context) => {
    
          console.log('Will get here only if foo was removed');
    
        }),
      );
    

    Important: The field function is not avoiding your function to be executed if changes happened in other fields, it will just ignore when the change is not what you want. If your document is too big, you should probably consider Doug's suggestion.

    0 讨论(0)
  • 2020-11-29 10:43

    Just out of the box what I do is watching before and after with the before and after method

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

    For example now you should compare the changes for a specific field and do some actions or just return it.

    Some more about before.data() and after.data() here

    0 讨论(0)
  • 2020-11-29 10:47

    Listen for the document, then set a conditional on the field you're interesting in:

    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);
                        });
    

    I'm listening for a document for a voice (Castilian-female-IBM), which contains an array of audio files, in webm and mp3 formats. When both of those audio files have come back asynchronously then snapshot.data().audioFiles.length === 2. This increments a conditional. When two more voices come back (Castilian-male-IBM and Latin_American-female-IBM) then audioFilesReady === 3 and the next function $scope.showNextWord() fires.

    0 讨论(0)
提交回复
热议问题