Firestore - Слушайте конкретное изменение поля?

Как я могу прослушать конкретное изменение поля с помощью firestore js sdk?

В документации они только показывают, как прослушивать весь документ, если какое-либо поле "SF" изменяется, оно вызывает обратный вызов.

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

Ответ 1

Вы не можете. Все операции в Firestore находятся на полном документе.

Это также верно для триггеров Firestore Cloud Function (вы можете получить только весь документ, который каким-то образом изменился).

Если вам нужно сузить область некоторых данных для извлечения из документа, поместите их в документ внутри субколлекции и запросите этот документ отдельно.

Ответ 2

На тот случай, если вы хотите игнорировать события в некоторых полях, вы можете сделать что-то вроде:

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

Я создал суть функции field здесь. Помните,, это не мешает запуску вашей функции, если изменения происходят в других полях, она просто не будет обрабатывать это вам и вместо этого вернет решенное обещание.

Ответ 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), который содержит массив аудиофайлов в форматах webm и mp3. Когда оба этих аудиофайла возвращаются асинхронно, тогда snapshot.data().audioFiles.length === 2. Это увеличивает условие. Когда возвращаются еще два голоса (Castilian-male-IBM и Latin_American-female-IBM), то запускается audioFilesReady === 3 и следующая функция $scope.showNextWord().

Ответ 4

Просто из коробки я смотрю до и после с помощью метода до и после

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() здесь