Прослушивание изменений данных Firebase Firestore только для текущих данных?

# #javascript #reactjs #firebase #react-native #google-cloud-firestore

Вопрос:

Допустим, у меня есть таблица базы данных Firebase firestore под названием «Статьи».

Я извлекаю список статей всякий раз, когда открываю приложение, и с помощью компонента FlatList, всякий раз, когда я достигаю конца, я извлекаю больше статей с помощью startAt() и EnDat ().

У меня также есть возможность ставить лайки или комментировать статьи, поэтому всякий раз, когда я это делаю, текущие статьи на экране обновляются (например, счетчик, счетчик комментариев обновляется).

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

Если я подпишусь на изменения в базе данных статей, startAt() и EnDat() будут перепутаны, если будут добавлены новые данные, когда пользователь просматривает Плоский список (правильно?). Вместо этого я хочу уведомлять пользователя только о том, когда добавляются новые статьи, и отображать кнопку «Доступны новые публикации» вверху, когда они есть, и если пользователь нажмет на нее, он просто обновит список.

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

Как мне решить эту проблему?

Ответ №1:

Вы можете проверить тип события , т. е. был ли документ created , modified или deleted как указано в документации. В случае добавления нового документа тип будет таким "created" . Тогда просто не добавляйте их в свой плоский список. Любое обновление до количества лайков будет "modified" событием, поэтому вы можете просто обновить его в списке. Вот пример, скопированный из документов:

 db.collection("cities").where("state", "==", "CA")
    .onSnapshot((snapshot) => {
        snapshot.docChanges().forEach((change) => {
            if (change.type === "added") {
                console.log("New city: ", change.doc.data());
            }
            if (change.type === "modified") {
                console.log("Modified city: ", change.doc.data());
            }
            if (change.type === "removed") {
                console.log("Removed city: ", change.doc.data());
            }
        });
    });
 

Важно: Первый снимок запроса содержит добавленные события для всех существующих документов, соответствующих запросу. Это связано с тем, что вы получаете набор изменений, которые приводят моментальный снимок запроса в соответствие с исходным состоянием запроса. Это позволяет, например, напрямую заполнять пользовательский интерфейс из изменений, полученных в первом моментальном снимке запроса, без необходимости добавлять специальную логику для обработки начального состояния.

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

 .where("addedAt", "<=", <the-timestamp>)