Firestore - Listen to specific field change?

2020-01-29 01:13发布

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 "SF" field changes, it will trigger the callback.

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

4条回答
唯我独甜
2楼-- · 2020-01-29 01:40

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.

查看更多
该账号已被封号
3楼-- · 2020-01-29 01:44

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

查看更多
【Aperson】
4楼-- · 2020-01-29 01:45

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.

查看更多
Deceive 欺骗
5楼-- · 2020-01-29 01:59

Just in case you want to ignore events in some fields, you can do something like:

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

I created a gist of the field function here. Remember, it is not avoiding your function to run if changes happen in other fields, it will just not handle that over to you and return a resolved promise instead.

查看更多
登录 后发表回答