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