Почему Firestore отправляет все результаты, а не только новые элементы при использовании on_snapshot? - PullRequest
0 голосов
/ 08 января 2020

Я использую Firebase's Firestore для хранения и публикации sh новых событий.

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

При первом подключении я хотел бы получить настоящий снимок . Однако, как только я подключился к Firestore и получил первоначальный снимок, с каждым новым элементом я хочу получать только обновления, а не всю коллекцию снова и снова!

function queryExercise(exercise){
    db.collection("exercises").where("exercise","==",exercise).onSnapshot(function(querySnapshot){
        querySnapshot.forEach(function(doc){
            var d_ = doc.data()
            console.log(d_);
            ...do somethign with d_...
        })
    })    
}

Когда я публикую sh новый элемент в коллекции, моя консоль заполнена всеми событиями, полученными ранее ... другими словами, он посылает мне полный снимок, а не только дельты.

Я что-то не так делаю или API действительно не поддерживает дельта-обновления?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Похоже, мне нужно было прослушать docChanges:

function queryExercise(exercise){
    db.collection("exercises").where("exercise","==",exercise).onSnapshot(function(querySnapshot){
        //              \/-----this thing
        querySnapshot.docChanges().forEach(function(change){
            var d_ = change.doc.data()
            console.log("Change type:", change.type, d_);
            ...
        });
    })    
}

С https://firebase.google.com/docs/firestore/query-data/listen

0 голосов
/ 08 января 2020

Так работают запросы Firestore. Если вы не предоставите фильтр для каких документов вы хотите в коллекции, вы получите все документы в этой коллекции. Единственный способ изменить это поведение - предоставить фильтр в вашем запросе, используя предложение where.

Похоже, вы задумывались о том, что делает «новый» документ в вашей коллекции. Вы должны будете представить это, используя какое-то поле в документах вашей коллекции. Обычно это поле типа отметки времени, которое добавляется или изменяется при создании или изменении документа. Это будет частью вашего предложения where, которое определяет, что является «новым». Используйте это поле в качестве фильтра, чтобы узнать, что нового.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...